2010-05-06 34 views
1

我正在研究CUDA,并且遇到与线程同步相关的问题。在我的代码中,我需要线程来执行代码的不同部分,例如:如何让不同的线程在CUDA中执行不同的部分?

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

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

回答

2

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

在一个块中,可以使用__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 
    } 
} 
+0

这是一个简单的解决方案,但要注意分支(导致当前warp被序列化)。尽可能尝试使半变形中的所有线程遵循相同的执行路径。 – Ljdawson 2010-05-14 23:16:00

0

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

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

// do common stuff on all threads 

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

如果您的程序包含多个块,则需要跨块使用自定义同步机制。如果你的内核只启动一个块,那么__syncthreads()将起作用。

相关问题