gpt4 book ai didi

c++ - 为什么我的并行 std::for_each 只使用 1 个线程?

转载 作者:行者123 更新时间:2023-12-05 03:45:22 26 4
gpt4 key购买 nike

我正在尝试并行化此 C++ 代码(计算点的连续傅立叶变换,建模为 Dirac 脉冲),此代码编译并正常工作,但它仅使用 1 个线程。我还需要做些什么才能让多个线程工作吗?这是在 4 核(8 线程)的 Mac 上,使用 GCC 10 编译。

vector<double> GetFourierImage(const Point pts[],
const int num_samples,
const int res,
const double freq_step) {
vector<double> fourier_img(res*res, 0.0);
double half_res = 0.5 * res;

vector<int> rows(res);
std::iota(rows.begin(), rows.end(), 0);
std::for_each( // Why doesn't this parallelize?
std::execution::par_unseq,
rows.begin(), rows.end(),
[&](int i) {
double y = freq_step * (i - half_res);
for (int j = 0; j < res; j++) {
double x = freq_step * (j - half_res);

double fx = 0.0, fy = 0.0;
for (int pt_idx = 0; pt_idx < num_samples; pt_idx++) {
double dot = (x * pts[pt_idx].x) + (y * pts[pt_idx].y);
double exp = -2.0 * M_PI * dot;
fx += cos(exp);
fy += sin(exp);
}
fourier_img[i*res + j] = sqrt((fx*fx + fy*fy) / num_samples);
}
});

return fourier_img;
}

最佳答案

在 GCC 9 中,当使用不同的执行策略时,存在对 TBB 的硬依赖,如果不存在,则构建将失败。这在 GCC 10 中发生了变化(并出现在 GCC 11 中),如果库不存在,则 for_each 将默认为顺序循环。这可以在 https://github.com/gcc-mirror/gcc/blob/releases/gcc-10.1.0/libstdc++-v3/include/bits/c++config#L679 看到.要解决您的问题,请尝试使用 -ltbb 链接到 TBB。这解决了您在使用 GCC 11.2 的 Ubuntu 20.04 上遇到的相同问题。

关于c++ - 为什么我的并行 std::for_each 只使用 1 个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65866491/

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