반응형
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가 실행되는 것이다.
반응형
'Programming > CUDA' 카테고리의 다른 글
[CUDA] Constant Memory 와 이벤트 (0) | 2023.05.02 |
---|---|
[CUDA] CUDA로 threading & shared memory (0) | 2023.05.02 |
[CUDA] CUDA C 기초 (0) | 2023.05.01 |
[CUDA] GPU Programming을 하는 이유 (0) | 2023.05.01 |