是否可以使用 target 从 for 循环访问索引给定以外的其他数组元素?

Is it possible to access other array elements than the given by the index from the for loop using target?

我想我很理解为什么可以使用 GPU 中的所有线程快速访问 A[i]。在下面0<=A[i]<N.

但是,下面代码中的锁和B[x]呢?对 lock[1]lock[2] 的两个访问是否不会相互阻塞,所以我根本没有任何并行化?

const int N=10000;
int A[N];
bool B[N];
omp_lock_t *lock = new omp_lock_t[N];
....
int i,x;
#pragma omp target data map(to:A,B)
#pragma omp parallel for private(x,i)
for(i=0,i<N,i++) {
  x=A[i];
  if (omp_test_lock(&lock[x]) {
    if (B[x]) {
        B[x]=false;
        do_stuff(i);
    }
    omp_unset_lock(lock[x]);
  }
}

Will two access to lock[1] and lock[2] not block for each other so I don't get any parallelizing at all?

锁是独立的。持有一个锁的线程不会阻止其他线程获取不同的锁。

即便如此,如果您的代码必须使用锁才能正常运行,那么这会减慢它的速度,甚至可能达到串行版本性能更好的程度。

你(认为你)需要那么多锁也有点可疑。更可疑的是,您使用 omp_test_lock() 而不是 omp_set_lock() —— 如果想要的锁不是立即可用,您应该考虑是否真的可以接受 do_stuff(i) 未执行。这似乎会使计算结果不确定。