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

Parallel processing 如何在CUDA应用程序中正确应用线程同步?,parallel-processing,cuda,synchronization,Parallel Processing,Cuda,Synchronization,一般来说,我在应用程序中偶尔使用线程同步,因为我不经常需要这个功能。我不是真正的高级C/C++程序员,但我也不是初学者。我开始学习CUDA C,与CPU的能力相比,GPU的能力让我兴奋不已,我意识到CUDA编程主要是关于并行线程执行的,有时需要适当的线程同步。事实上,我甚至不知道如何在C或C++中应用线程同步。我上一次使用同步大约是两年前,当时我正在用Java编写简单的应用程序,如下所示: synchronized returnType functionName(parameters) {

一般来说,我在应用程序中偶尔使用线程同步,因为我不经常需要这个功能。我不是真正的高级C/C++程序员,但我也不是初学者。我开始学习CUDA C,与CPU的能力相比,GPU的能力让我兴奋不已,我意识到CUDA编程主要是关于并行线程执行的,有时需要适当的线程同步。事实上,我甚至不知道如何在C或C++中应用线程同步。我上一次使用同步大约是两年前,当时我正在用Java编写简单的应用程序,如下所示:

synchronized returnType functionName(parameters)
{
    ...
}
__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
什么允许“functionName”在一个tmie上只由一个线程执行?也就是说,这个函数由不同的线程交替执行。现在回到CUDA C,如果一个块中有200个线程在while循环中运行代码:

while(some_condition)
{
    ...
}

我如何使线程彼此同步,线程也彼此同步,但采用线程和线程交替执行的同步方式(即前100个线程运行'while'的内容,然后下100个线程运行'while'的内容等等)?

我想您可能只需要这样做。您可能会陷入一个思维陷阱,认为您之前学习的编程范例应该在这里应用。我不确定情况是否如此

但为了回答您的问题,首先让我指出,CUDA中的线程同步只能在threadblock中实现。所以我的评论只适用于那里

设备代码中的主要同步机制是。要大致按照您描述的思路使用它,我可以编写如下代码:

synchronized returnType functionName(parameters)
{
    ...
}
__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
\uuuu syncthreads();
如果(螺纹内径x.x<100){
//此块中的代码将仅由线程0-99执行,其他所有线程不执行任何操作
}
__同步线程();
如果((threadIdx.x>99)和&(threadIdx.x<200)){
//此块中的代码仅由线程100-199执行,其他所有线程不执行任何操作
}
//所有线程都可以在此点开始执行
请注意,即使是threadblock中的线程也不是全部在lockstep中执行。SM(CUDA GPU中的threadblock处理单元)通常将threadblock分为32个线程组,称为warp,这些warp实际上(或多或少)以锁步方式执行。但是,如果您出于某种原因想这样做,我上面列出的代码仍然具有我描述的效果,即在线程组之间的顺序执行