CUDA非原子写入冲突结果

CUDA Non Atomic Write clash results

本文关键字:冲突 结果 CUDA      更新时间:2023-10-16

我正在编写一个函数,该函数需要迭代直到完成。我意识到我可以使用原子运算符,但速度在这个内核中至关重要,我怀疑它们可能不是必需的。

我已经包含了一小段伪代码来演示我打算做什么

__global__ void TestKernel()
{
__shared__ bool lbRepeat[1];
do
{
lbRepeat=false;
__syncthreads();
if(Condition == true) lbRepeat=true;
__syncthreads();
}
while(lbRepeat);
}

如果没有线程发现Condition为true,则lbRepeat将为false。

如果一个线程发现Condition为true,则lbRepeat将为true。

如果多个线程同时将true写入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中是原子的吗?

总结:

如果两个线程将相同的值写入一个布尔内存位置,结果是什么?

当另一个线程将新值写入同一位置时,从无符号短内存位置读取是否会返回一个既不是该内存位置中的前一个值也不是新值的值?

如果两个线程将相同的值写入一个布尔内存位置,结果是什么?

最终结果将是其中一个写入的值最终会出现在该内存位置。哪个值未定义。如果所有写入的值都相同,则可以确保该值最终会出现在该位置。

当另一个线程将新值写入同一位置时,从无符号短内存位置读取是否会返回一个既不是该内存位置中的前一个值也不是新值的值?

假设这只是正在进行的两个操作(一个写入,一个读取),否。读取值将是写入开始前的值或写入完成后的值。如果您有多个写入,那么当然可以看到第一个问题的答案。实际写入的值是未定义的,只是其中一个写入成功,而其他所有写入都没有成功。

我是在正确对齐的8、16或32位数据类型的上下文中进行上述陈述的,您的示例就是这些数据类型。