2011-10-19 3 views
0

나쁜 제목을 드려 죄송합니다. 나는 더 나은 무엇이 나올 수 없었다.CUDA : 오직 하나의 직업으로 시작합니다

내가 CUDA 프로그램에서 본 모든 예는 병렬화 할 준비가 된 미리 정의 된 데이터를 가지고 있습니다. 일반적인 예는 두 행렬이 이미 채워져있는 두 행렬의 합입니다. 그러나 새로운 작업을 생성하는 프로그램은 어떨까요? CUDA에서 이것을 어떻게 모델링합니까? 결과를 전달하여 어떻게 다른 스레드가 작업을 시작할 수 있도록합니까?

예 : 한 작업에서 커널을 실행한다고 말하십시오. 이 직업은 10 개의 새로운 독립적 인 직업을 창출합니다. 그들 각각은 10 명의 새로운 독립적 인 일자리를 창출합니다. 이것은 각 작업이 독립적이기 때문에 매우 평행 한 작업처럼 보입니다. 문제는 CUDA에서이를 모델링하는 방법을 모른다는 것입니다. 스레드가 계산을 시작할 수있는 경우 폴링을 유지하기 위해 커널에서 while 루프를 사용하는 CUDA에서이 작업을 시도했습니다. 각 스레드에 작업이 할당되었습니다. 하지만 그건 효과가 없었습니다. while 회 돌이를 무시한 것 같았다.

코드 예제 : 여러 커널 호출을 사용하는 것이 좋습니다

On host: 
fill ready array with 0 
ready[0] = 1; 

On device: 
__global__ void kernel(int *ready, int *result) 
{ 
    int tid = threadIdx.x; 
    if(tid < N) 
    { 
     int condition = ready[tid]; 
     while(condition != 1) 
     { 
      condition = ready[tid]; 
     } 

     result[tid] = 3;// later do real computation 

     //children jobs is now ready to work 
     int childIndex = tid * 10; 
     if(childIndex < (N-10)) 
     { 
      ready[childIndex + 1] = 1; ready[childIndex + 2] = 1; 
      ready[childIndex + 3] = 1; ready[childIndex + 4] = 1; 
      ready[childIndex + 5] = 1; ready[childIndex + 6] = 1; 
      ready[childIndex + 7] = 1; ready[childIndex + 8] = 1; 
      ready[childIndex + 9] = 1; ready[childIndex +10] = 1; 
     } 
    } 
} 

답변

8

. 일단 커널 작업이 끝나고 그 자식을위한 작업 단위를 생성하면 자식은 다른 커널에서 실행될 수 있습니다. 어쨌든 cuda 커널 내부에서 while 루프를 사용하여 폴링을하고 싶지는 않습니다.

나는 쿠다 병렬 감소 예제를 google 것이다. 여러 개의 커널로 분해하는 법을 보여줍니다. 유일한 차이점은 더 많은 일을 할 커널 사이의 작업량을 줄이는 것입니다.

+0

감사합니다. 나는 이렇게하려고 노력할 것이다. 잘하면 그것이 작동합니다. –

1

CUDA Dynamic Parallelism처럼 사용할 수 있습니다.

다른 커널 내부에서 커널을 호출 할 수 있습니다. 즉, 첫 번째 커널이 끝났을 때 10 개의 작업 생성이 완료되면 직전에 해당 작업을 처리 할 다음 커널을 호출 할 수 있습니다.