FFTW性能变化
FFTW performance variation
我在一个程序中使用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可能会在处理器数据缓存线上发生冲突,一个线程在某种半确定性的抖动中刷新另一个状态。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- C++取消引用指针.为什么会发生变化
- 为什么在读取文件大小时文件IO速度会发生变化
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 在类中使用随机生成器时出现性能问题
- 为什么cudaMemGetInfo报告设备内存总量的变化
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 如何避免LED在循环状态变化中闪烁?
- 海湾合作委员会 ARM 性能下降
- 当 I2C 值在C++中发生变化时收到通知
- GCC 和 Clang 代码性能的巨大差异
- 在容量内调整矢量大小时的性能影响
- 为什么使用默认构造函数"{}"而不是"= default"存在性能变化?
- 删除/释放性能变化
- FFTW性能变化
- 如何分析和/或消除由于内存分配引起的性能变化
- 条件样式不断变化的 IF 性能