FFTW性能变化

FFTW performance variation

本文关键字:变化 性能 FFTW      更新时间:2023-10-16

我在一个程序中使用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可能会在处理器数据缓存线上发生冲突,一个线程在某种半确定性的抖动中刷新另一个状态。