【发布时间】:2017-03-14 19:23:30
【问题描述】:
我有以下代码:
for (int i = 0; i < veryLargeArraySize; i++){
int value = A[i];
if (B[value] < MAX_VALUE) {
B[value]++;
}
}
我想在这里使用 OpenMP 工作共享结构,但我的问题是 B 数组上的同步 - 所有并行线程都可以访问数组 B 的任何元素,该元素非常大(这使得使用锁变得困难,因为我需要太多了)
#pragma omp critical 在这里是一个严重的开销。原子是不可能的,因为if。
有人对我如何做到这一点有好的建议吗?
【问题讨论】:
-
B与A相比有多大? -
@Zulan 都超过100万个元素,A略大(是一张图片的直方图计算——A是像素化的图片,B是直方图)
-
我会假设直方图的箱显着少于原始数据点的数量。直方图是不是很稀疏?
-
为什么要截断循环内的计数(B)?为什么不简单地无条件地添加一个,然后在 B 上的单独相位循环中截断这些值。然后你就可以使用原子了。
标签: c optimization parallel-processing synchronization openmp