我在一个程序中使用FFTW3对2D阵列(大约3k x 3k,复杂的数据类型)进行一些工作。
程序中最激烈的部分基本上是这样做的:
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个计划(每个缓冲区一个向前,一个向后)。
为什么我每次跑步的结果都会如此不同?
大型FFT性能通常主要取决于数据缓存命中率和未命中惩罚。一种可能性是,根据哪些线程被分配给哪些CPU核心,数据在内存中的条带化方式,以及FFT启动的确切顺序和时间,FFT可能会在处理器数据缓存线上发生冲突,一个线程在某种半确定性的抖动中刷新另一个状态。