【发布时间】:2016-03-01 05:12:53
【问题描述】:
我正在编写一个需要迭代直到完成的函数。我意识到我可以使用原子操作符,但在这个内核中速度很关键,我怀疑它们可能不是必需的。
我已经包含了一小段伪代码来演示我打算做什么
__global__ void TestKernel()
{
__shared__ bool lbRepeat[1];
do
{
lbRepeat=false;
__syncthreads();
if(Condition == true) lbRepeat=true;
__syncthreads();
}
while(lbRepeat);
}
如果没有线程发现条件为真,lbRepeat 将为假。
如果一个线程发现条件为真,lbRepeat 将为真。
如果多个线程同时写入 lbRepeat 会有什么结果?
我想将此扩展到复制整数值(特别是无符号 16 位)。除了检查条件外,我还想复制一个无符号的 16 位整数。
__global__ void TestKernel()
{
__shared__ unsigned short liValues[32*8];
__shared__ bool lbRepeat[1];
unsigned long tid = threadIdx.x+threadIdx.y*blockDim.x;
do
{
lbRepeat=false;
__syncthreads();
if(Condition == true)
{
liValue[tid] = liValue[Some_Value_In_Range];
lbRepeat=true;
}
__syncthreads();
}
while(lbRepeat);
}
如果另一个线程在读取内存时正在写入内存,这是否会导致既不返回先前值也不返回新值?我不介意是否返回先前的值或新的值(两者都将有效),但每个位的混合会导致问题。
我认为这是不可接受的,但我的测试似乎表明它可以按预期工作。这是因为未签名的短副本在 CUDA 中是原子的吗?
总结:
如果两个线程将相同的值写入一个布尔内存位置,结果是什么?
当另一个线程正在将新值写入同一位置时,从无符号短内存位置读取是否可以返回一个既不是该内存位置先前值也不是新值的值?
【问题讨论】: