【发布时间】:2018-08-10 20:55:05
【问题描述】:
在我正在开发的数值模拟中,我必须执行许多 2D 离散傅立叶变换,我使用 FFTW 进行数组乘法运算。
我正在为我的数据使用以下容器:
std::vector<std::complex<float>, fftwAllocator<std::complex<float>>> data(LX*LY);
LX 和 LY 不一定相等。 fftwAllocator 是一个自定义分配器,它使用fftw_malloc() 进行内存对齐。
目前,我的元素乘法看起来像这样:
Wave &operator*=(const Wave &m) {
for(unsigned int i = 0; i < LX * LY; i++)
_data[i] *= m._data[i];
return *this;
}
我知道,编译器可能做了很多魔法,但考虑到我的数组已经通过fftw_malloc() 以 SIMD 兼容的方式对齐,我想我也许可以在这里使用向量指令来加快速度更多的。
有没有一种简单的方法可以在这里引入独立于平台的向量指令?我真的很惊讶,FFTW 中没有包含向量的简单乘法,因为很多人用它来卷积信号......
【问题讨论】:
-
我会像您现在一样编写最清晰的代码,然后让优化器完成它的工作。然后衡量性能,看看它如何支持自滚动优化。
-
C++ 不知道向量化。您需要一个库来使其可移植。
-
@SombreroChicken:我知道这可能是最简单的,到目前为止我懒得真正衡量性能。但是,我无法判断它是否是
quick,因为我不知道使用 SIMD 会多快。 -
@NathanOliver:我知道我需要额外的代码甚至库。我认为对于预对齐的内存,在这里扩展我的简单循环不会太多工作。但是,如果结果很困难,我宁愿听从 Sombrero Chicken 的建议。 :)
-
你的编译器不是已经自动矢量化了吗?如果你告诉它数组总是对齐的,它可以帮助编译器做得更好,但我认为没有可移植的语法。在 GNU C 中,
foo = __builtin_assume_aligned(foo, 64);是一种方式,但您也可以 typedef 一个aligned_float指针,这有点骇人听闻。无论如何,gcc -O3应该自动矢量化这个就好了。