2013-09-02 2 views
0

내 CUDA 코드의 구조를 명확하게 정의하는 데 문제가 있습니다. 내 코드는 두 단계로 나뉩니다. 첫째, M * N 작업을 실행해야하며 그 결과는 다른 N 작업에 사용됩니다. CUDA를 이용하려면 두 가지 수준의 병렬 처리가 가능한지 궁금합니다. 먼저 dimGrid (N * M/dimBlock.x, N * M/dimBlock.y) 및 dimGrid (N/dimBlock.x, N/dimBlock.y)를 사용하여 다른 명령을 실행합니다.Cuda : 실행 중 격자 크기 변경

+0

"명령어"로 "커널 시작"을 의미하는 경우 블록 당 그리드와 스레드마다 다른 블록을 사용하여 동일한 커널을 실행할 수 있습니다. – JackOLantern

답변

0

예, GPU에서 다른 그리드 크기/구성을 가진 커널을 시작할 수 있습니다. 이 다음을 수행 할 수 있습니다 CUDA dynamic parallelism이라는 것을도하지만,

dim3 dimBlock(block_x, block_y); 
dim3 dimGrid1(N*M/dimBlock.x, N*M/dimBlock.y); 
mykernel1<<<dimGrid1, dimBlock>>>(...); 
dim3 dimGrid2(N/dimBlock.x, N/dimBlock.y); 
mykernel2<<<dimGrid2, dimBlock>>>(...); 

은 컴퓨팅의 GPU가 필요합니다

dim3 dimBlock(block_x, block_y); 
dim3 dimGrid1(N*M/dimBlock.x, N*M/dimBlock.y); 
mykernel<<<dimGrid1, dimBlock>>>(...); 
dim3 dimGrid2(N/dimBlock.x, N/dimBlock.y); 
mykernel<<<dimGrid2, dimBlock>>>(...); 

또는 다른 커널 : 이것은 당신이 동일한 커널을 실행할지 여부를 사실이다 기능 3.5 :

__global__ void kernel2(...){ 
... 
} 

__global__ void kernel1(...){ 
... 
dim3 dimBlock(block_x, block_y); 
dim3 dimGrid(N/dimBlock.x, N/dimBlock.y); 
kernel2<<<dimGrid, dimBlock>>>(...); 
... 
} 

및 동적 병렬로 재귀 적으로 동일한 커널을 호출도 ​​가능하다 :

__global__ void kernel1(...){ 
... 
dim3 dimBlock(block_x, block_y); 
dim3 dimGrid(N/dimBlock.x, N/dimBlock.y); 
kernel1<<<dimGrid, dimBlock>>>(...); 
... 
} 
+0

빠른 응답을 보내 주셔서 감사합니다. 나는 TESLA C2075를 사용하기 때문에 현재 동적 병렬 처리를 사용할 수 없습니다. – user2739435