CUDA非原子写入冲突结果
CUDA Non Atomic Write clash results
我正在编写一个函数,该函数需要迭代直到完成。我意识到我可以使用原子运算符,但速度在这个内核中至关重要,我怀疑它们可能不是必需的。
我已经包含了一小段伪代码来演示我打算做什么
__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位数据类型的上下文中进行上述陈述的,您的示例就是这些数据类型。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 写入位置0x0000000C时发生访问冲突
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 在更改for循环的第三部分后,未使用for循环结果
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 使用++运算符会导致意外的结果
- 正在使用new char[]或malloc的结果来铸造float*是UB(严格的混叠冲突)
- CUDA非原子写入冲突结果
- 正则表达式结果冲突
- 返回stbi_load函数的结果并将其用于glTexImage2D会导致内存冲突