是否可以使用 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)
未执行。这似乎会使计算结果不确定。
我想我很理解为什么可以使用 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)
未执行。这似乎会使计算结果不确定。