2015-02-06 47 views
0

我在程序中使用FFTW3在2D数组(大致3k x 3k,复杂数据类型)上做了一些工作。FFTW性能变化

该方案的最激烈的部分基本上做到这一点:

Break the array up into N threads, each thread has the following 

loop 
{ 
    Fill one of three buffers depending on what I'm doing 
    FFT forward on that buffer 
    Do some work 
    FFT backward on that buffer 
    Do some work 
} 

如果在分析我的代码中,我认识到,我花了执行FFTW的时间或者是约5秒,8秒,或12秒(取或半秒,但通常是这3个数字中的1个),具体取决于运行。

对于每个线程我与_align_malloc(x, 16)分配缓冲区(虽然fftw_malloc给了我同样的结果),然后在使用FFTW_PATIENT程序开始创建我6个计划(一个向前,一个向后,为每个缓冲区)只有一次。

为什么我的结果会因运行而异?

+0

“约3k x 3k”尺寸是否一致? 2的功率是最快的,非功率2的速度很大程度上取决于尺寸是否可以分解为小素数。 – 2015-02-06 23:29:57

+0

对不起,我应该指定,我分配的缓冲区在我做FFT的时候实际上是256x256或512x512,我一次只处理更大的矢量。 – RyanP 2015-02-07 00:07:51

+0

任何想法或澄清需要? – RyanP 2015-02-10 20:51:27

回答

0

较大的FFT性能通常主要针对数据缓存命中率和错失惩罚。一种可能性是,取决于哪些线程被分配给哪些CPU核心,数据如何在存储器中分条以及开始FFT的确切顺序和时间,FFT可能与处理器数据缓存线相冲突,一个线程冲洗在某些半确定性的鞭策中,

+0

谢谢! 这样就留下了什么是继续进行的最佳方式的问题。尝试设置每个线程与其自己的逻辑处理器的亲和力,然后尝试以某种方式为数组分配空间来表达意图是否合理?或者是否最好尝试同步这些线程,使它们不会同时触发代码的FFT部分? – RyanP 2015-02-13 14:35:42

+0

另外,我在FFT之外的工作中使用了一些SIMD内在函数。我知道FFTW也使用内在函数,这是否会导致任何问题?我从来不知道在x64模式下存在的16个SIMD寄存器是每个内核还是每个逻辑内核(在超线程机器上)。所以我不确定我是否会因为两个代码路径在HT内核上执行而导致需要保存和恢复寄存器状态的问题。虽然我的代码似乎需要一定的时间而没有变化,所以这会让我觉得事实并非如此。 – RyanP 2015-02-13 14:37:57