2011-02-24 5 views
0

HAi,CUDA 스레드가 다른 값을 출력합니다.

나는 cuda 프로그램을 작성 했으므로 아래 커널 기능을 제공했습니다. 장치 메모리는 CUDAMalloc()을 통해 할당 된
입니다. * md의 값은 10입니다.

__global__ void add(int *md) 

{ 

    int x,oper=2; 
    x=threadIdx.x; 

    * md = *md*oper; 

if(x==1) 
    { 
     *md = *md*0; 
    } 

    if(x==2) 
    { 
     *md = *md*10; 
    } 

    if(x==3) 
    { 
     *md = *md+1; 
    } 

    if(x==4) 
    { 
     *md = *md-1; 
    } 

} 

는 cudaMalloc()는 장치 메인 메모리에 할당 될 상기 코드

add<<<1,5>>(*md) , add<<<1,4>>>(*md) 

for <<<1,5>>> the output is 19 

for <<<1,4>>> the output is 21 

1) I 의심이 실행? 2) 마지막 스레드 만이 위의 프로그램에서 항상 실행되는 이유는 무엇입니까?

+0

으로 코드를 실행해야 할 일입니다. 반환 상태를 확인하면 알려지지 않은 세그 폴트를 프로그램 할 수 있습니다. – Anycorn

답변

1

모든 스레드가 코드에서, 같은 위치 (MD)에 다른 출력을 기록 감사드립니다. 결과적으로 프로그램 실행이 완료 될 때 md은 가능한 값 중 하나를 4 ~ 5 가지로 가질 수 있습니다. 당신은 모든 스레드의 출력을 잡을하려면

다음은

// The size of output is should be equal to the number of threads in your block 
    __global__ void add (int input, int * output){ 

    int x = threadIdx.x; 
    int oper = 2; 
     md = md*oper; 


    //thread Index starts from 0 in CUDA 

      if(x==0) 
      output[0]= md*0; // output is 0 


      if(x==1) 
      output[1] = md*10; // output is 200 


      if(x==2) 
      output[2] = md+1; // output is 21 


      if(x==3) 
      output[3] = md-1; // output is 19 


     ..... and so on 

    } 

실수의 더미가

int value = 10; 
int * out; 
int size = 5*sizeof(int); 
cudaMalloc((void**)&out,size); 

add<<<1,5>>(value,out) 

int * host_out = (int*)malloc(size); 
cudaMemcpy(host_out,out,size,cudaMemcpyDeviceToHost); 

//Now the host_out should have the following values: 
//host_out[0] = 0 
//host_out[1] = 200 
//host_out[2] = 21 
//host_out[3] = 19 
//host_out[4] = .. 
+0

이해해 주셔서 감사합니다. – kar

관련 문제