问题描述
我目前正在开展一个项目,使用 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
替换。在最后一次迭代中更换它也没有解决问题。
也许你有什么建议?
先谢谢你!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)