3

我目前正在开展一个项目,以使用 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在最后一次迭代中替换它也不能解决问题。也许你有什么建议?

先感谢您!

4

0 回答 0