c - 多个值的 OpenMP argmin 减少
问题描述
我有一个例程,它使用循环来计算给定下方粒子表面的粒子的最小高度。此例程尝试随机位置并计算最小高度,然后返回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
}
但我无法得到相应的x
and y
。最后,我只是得到一个随机的x
并由y
其中一个线程编写。
是否有可能获得这些值?如何?我正在考虑有一个数组,每个线程存储它们的值,x, y, zmin
然后在归约操作之后,将每个线程zmin
与归约后的全局值进行比较,然后得到与选择的值相对应的那些。从 OpenMP 的意义上说,有没有更好的方法,所以我不需要定义这个动态数组并比较浮点数?
解决方案
您可以使用用户定义的归约(自 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);
}
推荐阅读
- or-tools - or-tools :如果 `num_nurses` 不等于 `num_shifts`,Python 员工调度不会给出任何解决方案
- android - 无法解决:com.android.support.cardview-v7:28.0.0:
- scala - 了解 IO 单子
- mysql - 为什么游标在过程中取空?
- wordpress - 在同一个 EC2 实例和同一个端口上托管 2 个不同的网站
- powerbi - Power BI API - 按 ID 获取数据集
- android - 反向 AppBarLayout.ScrollingViewBehavior
- r - 将 SAS Proc Shewhart 转换为 R 编程
- php - mysqli_get_client_stats 是否向 sql server 发送请求
- printing - 修改与 gwbasic 一起使用的基本文件