multithreading - 使用 OpenMP 的并行 For 循环
问题描述
我对 OpenMP 中的并行 for 循环代码有问题,并行 for 循环的结果与顺序 for 循环不同。如何使此代码与顺序代码具有相同的结果。
counter = 0;
#pragma omp parallel for
for(i=0; i<L; i++) {
int sum_found = 0;
for(j=0; j<M; j++) {
int found = 0;
for(k=0; k<N_SUBSET; k++) {
if (i==0 && unsorted_arr[j*N_SUBSET + k] < intervals[i]) {
s_prime[counter] = unsorted_arr[j*N_SUBSET + k];
counter++;
found++;
}
else if (i!=0 && unsorted_arr[j*N_SUBSET + k] >= intervals[i-1] && unsorted_arr[j*N_SUBSET + k] < intervals[i]) {
s_prime[counter] = unsorted_arr[j*N_SUBSET + k];
counter++;
found++;
}
else if (i==L-1 && unsorted_arr[j*N_SUBSET + k] >= intervals[i-1]) {
s_prime[counter] = unsorted_arr[j*N_SUBSET + k];
counter++;
found++;
}
}
C[i][j] = found;
sum_found += found;
}
n_intervals_len[i] = sum_found;
}
解决方案
由于缺少上述代码的某些上下文(尤其是变量声明),因此很难判断出了什么问题。但这里有一些想法:
循环计数器 j 和 k 应该被声明为私有的,否则你可能会对它们产生竞争条件
counter++
andfound++
语句也是来自不同线程对同一变量的更新的竞争。您要么必须atomic
为它们使用构造,要么使用适当的 OpenMP 缩减来摆脱竞争条件。
推荐阅读
- excel-formula - 公式中不相邻的单元格导致参数过多
- node.js - 使用 ipcMain 和 ipcRenderer 解决 Electron 应用程序中的事件混乱的设计模式
- python - 如何使用 python 优化大文件的清理和合并时间?
- c - 使用带有函数原型的预处理器定义
- azure-logic-apps - 如何连接到 Azure Logic 应用中的 On Premise JIRA 实例
- performance - 如何正确确定 Intel 处理器的 -march 和 -mtune?
- docker - 无法在 oracle linux 上的 docker CE 中启动 docker 容器
- json - 在 ASP.Net Core 中使用 Newtonsoft 将 JSON 转换为模型时出现 ArgumentException
- angular - 在 Web API 上验证 Azure AD 令牌的问题
- python-3.x - 'int' 对象在枚举时不可迭代