gpt4 book ai didi

c - 多个值的 OpenMP argmin 缩减

转载 作者:行者123 更新时间:2023-12-02 09:10:51 25 4
gpt4 key购买 nike

我有一个例程,它使用一个循环来计算给定下方粒子表面的粒子的最小高度。此例程尝试随机位置并计算最小高度,然后返回 x, y, z 值,其中 z 是找到的最小高度。

此例程可以与omp parallel for 并行化。但我在弄清楚如何获取三元组 (x, y, z) 时遇到问题,而不仅仅是最小值 z (因为最小值 z 当然对应于给定的 x, y 坐标)。我实际上可以通过使用如下的归约操作得到最小的 z

double x = 0, y = 0, z = 1.0e300; // initially z is large
#pragma omp parallel for reduction(min:z)
for(int trial = 0; trial < NTRIALS; ++trial) {
// long routine that, at the end, computes x, y, z
// and selects only the x, y, z corresponding to the
// smallest z
}

但是我无法得到相应的xy。最后,我得到了其中一个线程编写的随机 xy

是否也可以获得这些值?如何?我在考虑有一个数组,每个线程存储它们的 x, y, zmin 值,然后在缩减操作之后,将每个线程 zmin 与缩减后的全局值进行比较然后得到那些对应于选择的那些。从某种意义上说,OpenMP 是否有更好的方法,这样我就不需要定义这个动态数组并比较 float ?

最佳答案


您可以使用用户定义的缩减(自 OpenMP 4.0 起可用)为多个值实现 argmin。为此,您必须将三元组放在一种类型中。定义一个方便的函数很有帮助。

struct xyz {
double x; double y; double z;
}

struct xyz xyz_min2(struct xyz a, struct xyz b) {
return a.z < b.z ? a : b;
}

#pragma omp declare reduction(xyz_min: struct xyz: omp_out=xyz_min2(omp_out, omp_in))\
initializer(omp_priv={0, 0, DBL_MAX})

struct xyz value = {0, 0, DBL_MAX};
#pragma omp parallel for reduction(xyz_min:value)
for (int trial = 0; trial < NTRIALS; ++trial) {
struct xyz new_value = ...;
value = xyz_min2(value, new_value);
}

关于c - 多个值的 OpenMP argmin 缩减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52390526/

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