如何解决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
替换。在最后一次迭代中更换它也没有解决问题。
也许你有什么建议?
先谢谢你!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。