【发布时间】:2021-06-09 23:42:55
【问题描述】:
考虑一个用于二维复数值数组的容器
#include <vector>
#include <array>
struct Array2D {
typedef std::array<double, 2> complex;
int X, Y;
std::vector<complex> values;
};
还有一个使用FFTW 计算傅里叶变换的函数:
#include <fftw3.h>
void FourierTransform(const Array2D& source, Array2D *dest) {
fftw_plan p = fftw_plan_dft_2d(source.X, source.Y, (fftw_complex*)source.values.data(), (fftw_complex*)dest->values.data(), FFTW_FORWARD, FFTW_ESTIMATE);
fftw_execute(p);
fftw_destroy_plan(p);
}
这不是一个最佳实现,因为它每次计算傅里叶变换时都会创建和销毁一个计划,但它方便且易于使用。但是,创建和销毁 FFTW 计划不是线程安全的(请参阅here),因此不应从不同的线程同时调用此函数。
问题:
- 我的应用程序中有许多不同的数组,我需要计算傅里叶变换和
- 在使用
#pragma omp parallel for并行化主循环和代码中我需要计算傅里叶变换的位置之间有几个函数调用。
在#pragma omp parallel for 之前初始化所有这些数组以及 fftw 计划,然后将它们作为参数传递给后续函数会使代码很多不那么清晰。还有其他方法可以让我以线程安全的方式封装和隐藏 FFTW 函数调用吗?
【问题讨论】:
-
旁白:你的演员表中有未定义的行为。你是
reinterpret_castingstd::array<double, 2> *到fftw_complex*,这是无效的。你为什么不使用std::complex<double>或_Complex?
标签: c++ multithreading openmp fftw