Programming/CUDA

[CUDA] Parallel Programming in CUDA

wawawaaw 2023. 5. 1. 02:11
반응형

 

Parallel Programming 

  • 그렇다면 이제 CUDA로 parallel 프로그래밍하는 방법을 알아보자!
__global__ void add(int* a, int* b, int* c) { 
	int tid = blockIdx.x; 
    if (tid < N) { 
    	c[tid] = a[tid]+b[tid];
        
}
#define N 10 

int main(void){
	int a[N], b[N], C[N]; 
    int* dev_a, *dev_b, *dev_c; 
    
    //allocate mem on gpu 
    cudaMalloc((void**)&dev_a, N*sizeof(int)); 
    cudaMalloc((void**)&dev_b, N*sizeof(int));     
    cudaMalloc((void**)&dev_c, N*sizeof(int));     
    
    //a,b 배열에 임의의 값 넣기 
    for(int i =0;i<N;i++){
    	a[i]=-i; 
        b[i] =i*i; 
    }
    
    //a,b값 gpu로 연산할 수 있도록 device로 옮기기
    cudaMemcpu(dev_a,a,N*sizeof(int),cudaMemcpyHostToDevice));
    cudaMemcpu(dev_b,b,N*sizeof(int),cudaMemcpyHostToDevice));   
    
    add<<N,1>>(dev_a,dev_b,dev_c); 
    
    cudaMemcpy(c,dev_c,N*sizeof(int),cudaMemcpyDeviceToHost));
    
    cudaFree(dev_a); 
    cudaFree(dev_b);     
    cudaFree(dev_c);     
    
    return 0; 
    
}
  • kernel <<<1,1>>>(param1,param2,...) ;
    • kernel 함수가 호출될 때 이같은 형식을 취한다. 
    • kernel <<< number_of_parallel_blocks, 1>>> : 첫번째 파라미터는 parallel로 돌릴 block의 수를 의미한다. 
    • kernel<<<256,1>>>이라면, 256개의 block을 동시에 돌린다는 것을 의미한다. 
    • 그런데 이렇게 된다면, 어떤 block 이 몇번째를 돌리는 지는 어떻게 알까? 
  • blockId.x 
    • blockId는 선언하지 않아도 사용 가능하다. cuda built in variable이기 때문이다. 따라서 위의 add 함수 안과 같이 사용이 가능하다. 
    • blockId.x가 의미하는 바는 blockId.y가 있다는 말이 아닐까? 즉 2차원의 block으로 생각하면 될 듯하다. 
  • grid : 여러개의 parallel running block을 의미한다. 
    • 예를 들어 위의 예시를 보면 1차원 N-block을 가진 grid가 실행되는 것이다.

 

반응형