c++ - OpenMP 卸载数据竞争
问题描述
我目前正在开展一个项目,以使用 OpenMP 在 GPU 上反转矩阵。但是,当对矩阵的一行进行归一化时,我遇到了数据竞争。代码如下所示:
#pragma omp target data map(tofrom: matrix[0:dim*dim], iden[0:dim*dim]) map(alloc: factor)
for (int i = 0; i < dim; i++) {
// fix data race on cpu, this should not be necessary
#pragma omp target update from(matrix[i * dim + i])
factor = matrix[i * dim + i];
#pragma omp target update to(factor)
#pragma omp target teams distribute shared(factor)
for (int x = i; x < dim + i + 1; x++) {
//barrier doesn't help
// float factor = matrix[i * dim + i];
//#pragma omp barrier
if (x < dim) {
matrix[i * dim + x] /= factor;
} else {
iden[i * dim + x - dim] /= factor;
}
}
...
}
发生数据竞争是因为在计算过程中的某个时刻matrix[i * dim + i]
会被替换。1.0
在最后一次迭代中替换它也不能解决问题。也许你有什么建议?
先感谢您!
解决方案
推荐阅读
- arrays - Excel VBA 数组:有没有一种简单的方法可以按索引删除数据集?
- kernel - Buildroot - 如何自定义现有的内核 defconfig
- java - 是一种混合使用 Annotation 和 Simple 模块进行反序列化的方法吗?
- intel - 3D 扫描室内位置
- jquery - 如何使用ajax发送多个文件和json数据
- css - 网格内溢出自动内的粘性表格标题
- django - POST 到 TestUpdateView 更新现有对象并创建新对象
- c# - 如何使用 Automapper 和 DI 映射导航属性集合
- sql - 单表与两个一对一相关表的性能
- vue.js - 我可以在 Vue js 中使用计算属性比较两个数组吗?