2016-09-29 2 views
1

미분 방정식을 풀기 위해 반복적으로 3 차원 함수의 푸리에 변환/역 푸리에 변환을 수행해야합니다. 예 :비구 동 메시의 FFT 속도

import pyfftw.interfaces.numpy_fft as fftw 
for i in range(largeNumber): 
    fFS = fftw.rfftn(f) 
    # Do stuff 
    f = fftw.irfftn(fFS) 

f의 모양은 매우 비 입체적입니다. 크기 순서에 따라 성능 차이가 있습니까 (예 : (512, 32, 128) vs (512, 128, 32) 등)?

나는 어떤 속도 향상도 찾고있다. 나는 이미 지혜로 놀고 다녔다. 가장 큰 치수 (예 : 32, 128, 512)가 fFS.shape = (32, 128, 257)이되도록 가장 빠르다고 생각했으나 실제로는 그렇지 않습니다.

답변

0

실제로 모든 성능을 압착하려면 FFTW 개체를 직접 사용하십시오 (pyfftw.builders을 통해 가장 쉽게 액세스 할 수 있음). 이 방법을 사용하면 복사가 정확히 발생하는지 그리고 정규화가 역으로 수행되는지 여부를 신중하게 제어 할 수 있습니다.

코드를 그대로두고 캐시를 사용하면 (pyfftw.interfaces.cache.enable()을 호출하여 사용 가능) 이점을 얻을 수 있으므로 일반적인 경우와 안전한 경우의 설정 시간을 최소화 할 수 있지만 제거하지는 못합니다.

최상의 치수 배열에 관해서는, 그것을 빨아보고 봐야합니다. 모든 다양한 옵션을 시도하고 가장 빠른 것을 확인하십시오 (timeit). 테스트 할 때 실제로 메모리에 배열 된 데이터를 실제로 사용하고 있는지 확인하십시오. 메모리에있는 동일한 배열을 보지 않고 (pyfftw은 복사없이 잘 처리 할 수 ​​있습니다. -이 정렬에 대한 매개 변수가 있지만).

은 다양한 옵션 (다른 FFT 표현에 대해 다른 알고리즘)을 시도하고 가장 빠른 것을 선택하므로 표면적으로 매우 유사한 다른 데이터 세트에 대해 변경 될 수있는 명확하지 않은 구현이됩니다.

일반 팁 : 최대 성능을위한 멀티 스레딩에

  • 를 켭니다 (해당 threads=N 설정).
  • 배열이 적절하게 바이트 정렬되어 있는지 확인하십시오. 이는 현대 하드웨어와 비교할 때 영향이 적지 만 차이가 발생할 수 있습니다 (특히 모든 상위 차원 크기에 바이트 정렬이있는 경우).
  • tutorialapi docs을 읽으십시오.