2010-05-06 6 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

이것은 간단한 해결책이지만 브랜칭 (현재 워프가 직렬화 됨)에 유의해야합니다. 가능한 경우 반쪽 워프의 모든 스레드가 동일한 실행 경로를 따르도록하십시오. – Ljdawson

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()가 작동합니다.

관련 문제