gpt4 book ai didi

c++ - 与 omp 并行

转载 作者:行者123 更新时间:2023-11-28 06:30:31 25 4
gpt4 key购买 nike

我尝试使用 OpenMP 优化以下循环:

    #pragma omp parallel for private(diff)
for (int j = 0; j < x.d; ++j) {
diff = x(example,j) - x(chosen_pts[ndx - 1],j);
#pragma omp atomic
d2 += diff * diff;
}

但它实际上比没有 #pragma 时慢 4 倍。

编辑

正如 Piotr S.、coincoin 和 erenon 指出的那样,在我的例子中,x.d 是如此之小,这就是并行性使我的代码运行速度变慢的原因。外循环我也贴出来了,也许多线程有一定的可能:(x.n过亿)

float sum_distribution = 0.0;
// look for the point that is furthest from any center
float max_dist = 0.0;

for (int i = 0; i < x.n; ++i) {
int example = dist2[i].second;
float d2 = 0.0, diff;
//#pragma omp parallel for private(diff) reduction(+:d2)
for (int j = 0; j < x.d; ++j) {
diff = x(example,j) - x(chosen_pts[ndx - 1],j);

d2 += diff * diff;
}
if (d2 < dist2[i].first) {
dist2[i].first = d2;
}

if (dist2[i].first > max_dist) {
max_dist = dist2[i].first;
}

sum_distribution += dist2[i].first;
}

如果有人感兴趣,这里是整个函数:https://github.com/ghamerly/baylorml/blob/master/fast_kmeans/general_functions.cpp#L169 ,但据我测量,85% 的运行时间来自此循环。

最佳答案

是的,正如发布的那样,外部循环可以与 OpenMP 并行化。在循环中修改的所有变量要么是迭代的局部变量,要么用于循环中的聚合。我假设在计算 diff 时调用 x() 没有副作用。

要正确有效地并行聚合,您需要使用带有 reduction 子句的 OpenMP 循环。对于 sum_distribution,缩减操作是 +,对于 max_dist,它是 max。因此,在外循环前面添加以下编译指示应该可以完成这项工作:

#pragma omp parallel for reduction(+:sum_distribution) reduction(max:max_dist)

请注意,max 作为缩减操作只能从 OpenMP 3.1 开始使用。它不是那么新,所以大多数支持 OpenMP 的编译器已经支持它,但不是全部;或者您可能使用旧版本。因此,查阅您的编译器的文档是有意义的。

关于c++ - 与 omp 并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27675617/

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