我有一个大小为32的数组alpha
位于共享内存中,因此很容易造成银行冲突。我想如果我在访问alpha
时使用锁定,它就不会导致银行混淆,是吗?
__shared__ int alpha[32];
bool lock = true;
while (lock) {
if (0 == atomicCAS(mutex, 0, 1)) {
int alpValue = alpha[indexalpha]; //indexalpha is computed
if (alpValue > dist)
{
atomicExch(&alpha[indexalpha], dist);
}
atomicExch(mutex, 0);
lock = false;
}
}
PS:我可以在每个区块使用锁吗?
答案 0 :(得分:1)
银行冲突是共享内存寻址问题。硬件处理它们的方式是通过序列化访问warp中的同一个bank。使用互斥锁/锁手动执行此操作并不比硬件解决方案更好,并且只能降低效率。
如果在这里存在一些误解,我想提一下银行冲突不会自动造成竞争条件。它们与硬件限制有关,因此仅影响性能,而不是正确性。
银行冲突的真正解决方案是重新组织您的共享内存访问模式以阻止它们。