Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CUDA非原子写入冲突结果_C++_Cuda_Atomic - Fatal编程技术网

C++ CUDA非原子写入冲突结果

C++ CUDA非原子写入冲突结果,c++,cuda,atomic,C++,Cuda,Atomic,我正在写一个函数,它需要迭代直到完成。我意识到我可以使用原子操作符,但在这个内核中速度是至关重要的,我怀疑它们可能不是必需的 我已经包含了一小段伪代码来演示我打算做什么 __global__ void TestKernel() { __shared__ bool lbRepeat[1]; do { lbRepeat=false; __syncthreads(); if(Condition == true) lbRepeat=true; __syncth

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

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

__global__ void TestKernel()
{
  __shared__ bool lbRepeat[1];
  do
  {
    lbRepeat=false;
    __syncthreads();
    if(Condition == true) lbRepeat=true;
    __syncthreads();
  }
  while(lbRepeat);
}
如果没有线程发现条件为true,那么重复将为false

如果一个线程发现该条件为真,则lbRepeat将为真

如果多个线程同时将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位数据类型的上下文中进行上述陈述的,您的示例就是这样

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

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

当另一个线程正在向同一个位置写入新值时,从无符号短内存位置读取数据是否会返回一个既不是该内存位置中的上一个值也不是该内存位置中的新值的值

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


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

太好了。非常感谢你。清楚地向我展示了解决当前问题的前进道路。这太棒了。非常感谢你。清楚地告诉我解决当前问题的前进方向。