2012-01-18 2 views
0

다음 프로그램은 'Cuda By Example'의 원자 잠금 구현을 사용했지만 프로그램을 실행하면 시스템이 정지됩니다. 누군가 내 프로그램에 어떤 문제가 있다고 말할 수 있습니까? 덕분에 많은CUDA의 원자 연산

이페이

#include <stdio.h> 


__global__ void test() 
{ 
    __shared__ int i, mutex; 

    if (threadIdx.x == 0) { 
     i = 0; 
     mutex = 0; 
    } 
    __syncthreads(); 

    while(atomicCAS(&mutex, 0, 1) != 0); 
    i++; 
    printf("thread %d: %d\n", threadIdx.x, i); 
    atomicExch(&mutex,0); 
} 
+0

위의 프로그램은 내가하려는 일의 예일뿐입니다. 위의 경우에 atomicAdd를 사용하여 i를 증가시킬 수 있다는 것을 알고 있습니다. 그러나 중요한 부분은 내 실제 사례에서 더 복잡합니다. – user11869

답변

3

여기에 이론이다. 당신이 워프의 개념을 잘 알고 있기를 바랍니다. while 루프에서 워프 내의 모든 스레드는 while 루프를 입력합니다. 하나만 종료되고 나머지 스레드는 while 루프 내에 있습니다. 이것은 분기가 다시 수렴 할 때까지 while 루프를 종료하는 스레드를 만드는 분기를 도입합니다. 이 스레드가 뮤텍스를 릴리스 할 수있는 유일한 스레드이기 때문에 다른 스레드가 수렴을 기다리기 때문에 결코 발생하지 않습니다.