【发布时间】:2015-05-30 20:41:09
【问题描述】:
我有大小为 N 的数组 a 和随机数。使用 OpenMP,我想为 A 中的每个数字递增数组 b 的元素 0 到 9,大小为 10。语言是 C。
#pragma omp parallel for
for(i = 0; i < N; i++)
b[a[i]]++;
不幸的是,在 b 的某些元素中显然存在同时写入,结果与预期不符。我尝试将 b 设置为 firstprivate 和 lastprivate 但这也没有帮助。
任务看起来很简单,但我不知道该怎么做,因为 OpenMP 中没有数组的 atomic。我可以为线程数创建一个新数组,然后最后将它们加在一起,但这似乎不是最佳选择。
在数组b 的元素中计算a 中的数字出现次数的最快方法是什么?
【问题讨论】:
-
独立求和,然后合并结果。
-
@BrianCain 我不确定你的意思。 “总和”是指增量吗?使用“独立”是指我应该创建一个新的私有变量吗?使用合并,您的意思是我应该最后将所有版本的私有变量相加吗?因为这对我来说似乎是低效的。你能用一个简单的代码片段告诉我你的意思吗?
-
算法并不像我想象的那么简单。但最终这是一个权衡,它是否有效可能取决于 N 与
b的大小之比(它真的总是 10 吗?)。一个更简单的替代方法是使用一系列互斥锁。 -
我不明白“OpenMP 中的数组没有
atomic”。您指的是哪个 OpenMP 规范?而且您并没有尝试在数组上进行原子操作。您正在尝试以原子方式递增数组的单个元素,但我找不到任何证据表明这不起作用。
标签: c arrays for-loop openmp increment