Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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
Cuda atomicInc()不工作_Cuda_Gpu Atomics - Fatal编程技术网

Cuda atomicInc()不工作

Cuda atomicInc()不工作,cuda,gpu-atomics,Cuda,Gpu Atomics,我使用atomicInc()尝试了以下程序 我不明白为什么它不是递增的。有人能帮忙吗?参考,atomicInc这样做: 有关下列事项: atomicInc ((unsigned int *)&count[0],n); 计算: ((count[0] >= n) ? 0 : (count[0]+1)) 并将结果存储回count[0] (如果您不确定?操作员的工作,请查看) 由于您传递了n=1,并且count[0]从1开始,因此atomicInc从未实际将变量count[0]增加到1

我使用atomicInc()尝试了以下程序

我不明白为什么它不是递增的。有人能帮忙吗?

参考,
atomicInc
这样做:

有关下列事项:

atomicInc ((unsigned int *)&count[0],n);
计算:

((count[0] >= n) ? 0 : (count[0]+1))
并将结果存储回
count[0]

(如果您不确定
操作员的工作,请查看)

由于您传递了
n
=1,并且
count[0]
从1开始,因此
atomicInc
从未实际将变量
count[0]
增加到1之外

如果希望看到其增量超过1,请为
n
传递一个较大的值

变量
n
实际上充当递增过程的“滚动值”。当要递增的变量实际达到
n
的值时,下一个
atomicInc
将其重置为零

虽然您还没有问过这个问题,但您可能会问,“如果我达到了翻滚值,为什么我从来没有看到零的值?”

要回答这个问题,您必须记住所有4个线程都是在lockstep中执行的。在执行后续的print语句之前,所有4个语句都执行
atomicInc
指令

因此,我们有一个变量
count[0]
,它从1开始

  • 第一个执行原子的线程将其重置为零
  • 下一个线程将其增量为1
  • 第三个线程将其重置为零
  • 第四个也是最后一个线程将其增量为1
  • 然后所有4个线程都打印出值

    作为另一个实验,尝试启动5个线程而不是4个线程,看看是否可以预测打印出来的值

    ker<<<1,5>>>(hitCount_d);
    
    您将得到您可能期望的结果。

    参考,
    atomicInc
    可以:

    有关下列事项:

    atomicInc ((unsigned int *)&count[0],n);
    
    计算:

    ((count[0] >= n) ? 0 : (count[0]+1))
    
    并将结果存储回
    count[0]

    (如果您不确定
    操作员的工作,请查看)

    由于您传递了
    n
    =1,并且
    count[0]
    从1开始,因此
    atomicInc
    从未实际将变量
    count[0]
    增加到1之外

    如果希望看到其增量超过1,请为
    n
    传递一个较大的值

    变量
    n
    实际上充当递增过程的“滚动值”。当要递增的变量实际达到
    n
    的值时,下一个
    atomicInc
    将其重置为零

    虽然您还没有问过这个问题,但您可能会问,“如果我达到了翻滚值,为什么我从来没有看到零的值?”

    要回答这个问题,您必须记住所有4个线程都是在lockstep中执行的。在执行后续的print语句之前,所有4个语句都执行
    atomicInc
    指令

    因此,我们有一个变量
    count[0]
    ,它从1开始

  • 第一个执行原子的线程将其重置为零
  • 下一个线程将其增量为1
  • 第三个线程将其重置为零
  • 第四个也是最后一个线程将其增量为1
  • 然后所有4个线程都打印出值

    作为另一个实验,尝试启动5个线程而不是4个线程,看看是否可以预测打印出来的值

    ker<<<1,5>>>(hitCount_d);
    

    您将得到您可能期望的结果。

    看起来您确实想使用atomicAdd,而不是atomicInc.@talonmies Thnak。我使用了atomicAdd(),然后它就开始工作了。但我怀疑在哪种情况下我们可以使用atomicInc()?看起来你真的想使用atomicAdd,而不是atomicInc。@talonmies Thnak。我使用了atomicAdd(),然后它就开始工作了。但我怀疑在哪种情况下我们可以使用atomicInc()。?