2011-02-18 4 views
1

다음 함수를 CUDA로 변환하고 싶습니다. 어떻게 이것을 위해 CUDA 전역 함수를 작성 하시겠습니까?

void fun() 
{ 
    for(i = 0; i < terrainGridLength; i++) 
    { 
     for(j = 0; j < terrainGridWidth; j++) 
     { 
      //CODE of function 
     } 
    } 
} 

나는 다음과 같은 기능을 썼다 :
__global__ void fun() 
{ 
    int i = blockIdx.x * blockDim.x + threadIdx.x; 
    int j = blockIdx.y * blockDim.y + threadIdx.y; 

    if((i < terrainGridLength)&&(j<terrainGridWidth)) 
    { 
      //CODE of function 
    } 
} 

나는 상수로 terrainGridLength 및 terrainGridWidth 모두를 선언하고 모두 값 (120)을 할당. 그리고

재미 < < < 30,500 >>>()

같은 함수를 호출하고하지만 난 정확한 출력을 받고 있지 않다.

내가 작성한 코드가 맞습니까? 코드의 parellel 실행에 대해 많은 것을 이해하지 못했습니다. 코드가 어떻게 작동하는지 설명하고 실수를 저지른 경우 수정하십시오.

답변

4

당신은 당신이 2 차원 배열 스레드를 사용하는 것을 의미 Y 치수를 사용, 그래서 당신은 단지와 커널을 호출 할 수 없습니다 :

int numBlock = 30; 
int numThreadsPerBlock = 500; 
fun<<<numBlock,numThreadsPerBlock>>>() 

호출해야한다 : (현재 블록은 2D 스레드를 가지고 주)

dim3 dimGrid(GRID_SIZE, GRID_SIZE); // 2D Grids with size = GRID_SIZE*GRID_SIZE 
dim3 dimBlocks(BLOCK_SIZE, BLOCK_SIZE); //2D Blocks with size = BLOCK_SIZE*BLOCK_SIZE 
fun<<<dimGrid, dimBlocks>>>() 

추가 정보를 원하시면 CUDA Programming Guide을 참고하여, 또한 2 차원 배열 또는 3D 작업을 수행하려는 경우, 당신은 더 나은 사용 cudaMalloc3D 또는으로 cudaMallocPitch

당신의 코드, 나는 이것이 효과가 있다고 생각한다. (그러나 나는 시도하지 않았다. 당신이 이것으로 아이디어를 얻을 수 있기를 바란다).

//main 
dim3 dimGrid(1, 1); // 2D Grids with size = 1 
dim3 dimBlocks(Width, Height); //2D Blocks with size = Height*Width 
fun<<<dimGrid, dimBlocks>>>(Width, Height) 

//kernel 
__global__ void fun(int Width, int Height) 
{ 
    int i = blockIdx.x * blockDim.x + threadIdx.x; 
    int j = blockIdx.y * blockDim.y + threadIdx.y; 

    if((i < Width)&&(j<Height)) 
    { 
      //CODE of function 
    } 
} 
관련 문제