如何在CUDA应用程序中正确应用线程同步?

时间:2013-05-23 21:45:41

标签: parallel-processing cuda synchronization

通常我在我的应用程序中偶尔使用线程同步,因为我不经常需要这个功能。我不是高级C / C ++程序员,但我也不是初学者。我开始学习CUDA C,感受当前GPU的强大功能,与CPU的功能相比,我意识到CUDA编程主要是关于并行线程执行,有时需要正确的线程同步。实际上我甚至不知道如何在C或C ++中应用线程同步。我上次使用同步的时间大约是2年前,我正在用Java编写简单的应用程序:

synchronized returnType functionName(parameters)
{
    ...
}

允许'functionName'仅由tmie上的一个线程执行 - 即此函数由不同的线程交替执行。现在回到CUDA C,如果我有,例如块中的200个线程在循环中运行代码:

while(some_condition)
{
    ...
}

如何制作线程< 0 - 99>彼此同步并且线程< 100-199>也是彼此同步的,但是以线程< 0-99>的方式应用同步。和< 100-199>交替执行(前100个线程运行'while'的内容,然后接下来的100个线程运行'while'的内容,依此类推)?

1 个答案:

答案 0 :(得分:1)

我认为您可能只需要learn more about cuda。你可能陷入了一个陷阱,认为你学到的先前的编程范式是应该在这里应用的东西。我不确定是不是这样。

但是要回答你的问题,首先让我指出CUDA中的线程同步只能在一个线程块内完成。所以我的评论只适用于那里。

设备代码中的主要同步机制是__syncthreads()。为了大致沿着你描述的方向使用它,我可以编写类似这样的代码:

__syncthreads();
if (threadIdx.x < 100){
   // code in this block will only be executed by threads 0-99, all others do nothing
  }
__syncthreads();
if ((threadIdx.x > 99) && (threadIdx.x < 200)){
  // code in this block will only be executed by threads 100-199, all others do nothing
  }
// all threads can begin executing at this point

请注意,即使线程块中的线程也不是全部以锁步方式执行。 SM(CUDA GPU中的线程块处理单元)通常将线程块分成32个线程组,称为 warps ,这些warp实际上(或多或少)以锁步方式执行。但是,上面列出的代码仍然具有我描述的效果,就线程组中的顺序执行而言,如果你想出于某种原因这样做。