gpt4 book ai didi

c++ - 优化用 fftw_malloc() 分配的两个 std::vector> 的逐元素乘积

转载 作者:行者123 更新时间:2023-11-28 04:47:05 29 4
gpt4 key购买 nike

在我正在开发的数值模拟中,我必须执行许多二维离散傅立叶变换,我使用 FFTW 进行,以及数组的逐元素乘法。

我正在为我的数据使用以下容器:

std::vector<std::complex<float>, fftwAllocator<std::complex<float>>> data(LX*LY);

LXLY 不一定相等。 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 兼容的方式对齐,我想我可以使用 vector此处的说明可以加快速度。

这里有没有简单的方法来引入平台无关的 vector 指令?我真的很惊讶,FFTW 中并没有包含简单的 vector 乘法,因为很多人用它来卷积信号...

最佳答案

正如 Peter Cordes 在对我的问题的评论中所建议的那样,gcc 能够自行向量化某些指令,这可以通过编译标志 -fopt-info-vec-all.

然而,事实证明 complex& operator*=(const T& other); 无法向量化,所以我不得不用以下内容替换问题中的函数:

Wave &operator*=(const Wave &m) {
// the builtin product of std::complex is not
// vectorized by gcc, so we're doing it manually
// here.
float tmp;
for(unsigned int i = 0; i < _lx * _ly; i++) {
tmp = _data[i].real();
_data[i].real(_data[i].real() * m._data[i].real() - _data[i].imag() * m._data[i].imag());
_data[i].imag(tmp * m._data[i].imag() + _data[i].imag() * m._data[i].real());
}

return *this;
}

有了它,gcc -O3 成功地向量化了循环。

关于c++ - 优化用 fftw_malloc() 分配的两个 std::vector<std::complex<float>> 的逐元素乘积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49072568/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com