如何让不同的线程在CUDA中执行不同的部分?

如何让不同的线程在CUDA中执行不同的部分?,cuda,Cuda,我正在CUDA上工作,我有一个与线程同步相关的问题。在我的代码中,我需要线程来执行代码的不同部分,如: one thread -> all thread -> one thread -> 这就是我想要的。在代码的初始部分,只有一个线程将执行,然后部分线程将由所有线程执行,然后再由单个线程执行。线程也在循环中执行。谁能告诉我怎么做 您需要使用线程ID来控制执行的内容,例如 if (thread_ID == 0) { // do single thread stuff }

我正在CUDA上工作,我有一个与线程同步相关的问题。在我的代码中,我需要线程来执行代码的不同部分,如:

one thread -> 
all thread ->
one thread ->

这就是我想要的。在代码的初始部分,只有一个线程将执行,然后部分线程将由所有线程执行,然后再由单个线程执行。线程也在循环中执行。谁能告诉我怎么做

您需要使用线程ID来控制执行的内容,例如

if (thread_ID == 0)
{
  // do single thread stuff
}

// do common stuff on all threads

if (thread_ID == 0)
{
  // do single thread stuff
}

只能在单个块内同步线程。可以在多个块之间进行同步,但只能在非常特定的情况下进行。如果您需要所有线程之间的全局同步,那么方法就是启动一个新内核

在块中,您可以使用
\uuu syncthreads()
同步线程。例如:

__global__ void F(float *A, int N)
{
    int idx = threadIdx.x + blockIdx.x * blockDim.x;

    if (threadIdx.x == 0) // thread 0 of each block does this:
    {
         // Whatever
    }
    __syncthreads();

    if (idx < N) // prevent buffer overruns
    {
        A[idx] = A[idx] * A[idx];  // "real work"
    }

    __syncthreads();

    if (threadIdx.x == 0) // thread 0 of each block does this:
    {
         // Whatever
    }
}
\uuuuu全局\uuuuu无效F(浮点*A,整数N)
{
int idx=threadIdx.x+blockIdx.x*blockDim.x;
如果(threadIdx.x==0)//每个块的线程0执行以下操作:
{
//随便
}
__同步线程();
if(idx
如果程序包含多个块,则需要跨块使用自定义同步机制。如果内核只启动一个块,那么u syncthreads()就可以工作。

这是一个简单的解决方案,但要注意分支(这会导致当前扭曲被序列化)。如果可能,尝试使半扭曲中的所有线程遵循相同的执行路径。