반응형
기본 함수
- CUDA는 C 기반이기 때문에 기본적으로 함수를 작성할떄 c언어 처럼 작성한다.
#include "../sth.h "
int main(void){
printf("hello world");
return 0;
}
- 이렇게 기본함수, cpu에서만 실행하는 것을 host라고 칭하자.
Kernel Call
- GPU(device)에서 실행하도록 하는 것을 kernel에서 실행한다고 부른다.
- device에서 실행할 수 있도록 kernel call 을 해보자
#include "../sth.h "
__global__ void kernel(void){
}
int main(void){
kernel <<1,1>>();
printf("hello world");
return 0;
}
- __global__ : 이러한 qualifier이 붙었다는 것은 host가 아닌 device, gpu에서 해당 function을 실행하겠다는 것을 의미한다.
- <<1,1>>는 인자를 넘길 것이라는 의미. 다음 포스팅에서 다루겠다.
Parameter passing 인자 넘기기
#include "../sth.h "
__global__ void add(int a, int b, int* c){
*c = a+b;
}
int main(void){
int c;
int* dev_c;
HANDLE_ERROR( cudaMalloc ((void**) &dev_c, sizeof(int)));
add<<<1,1>>>(2,7,dev_c);
HANDLE_ERROR( cudaMemcpy (&c, dev_c, sizeof(int) , cudaMemcpyDeviceToHost );
cudaFree(dev_c);
return 0;
}
- kernel 도 마찬가지 방법으로 parameter passing을 하면된다.
- cudaMalloc :
- devPtr 은 새로 할당된 메모리를 가르킬 포인터.
- size는 할당하고싶은 메모리의 사이즈
- cudaFree : 할당한 메모리 free
- cudaMemcpy() : device memory에 접근하기
- device에서 가져온 값 copy하는 작업
- dst 는 복사할 변수
- src 는 복사할 값이 담긴 변수
- cudaMemcpyDeviceToHost : src가 device고 dst가 host라는 것을 알려주는 것.
- cudaMemcpyHostToDevice , cudaMemcpyDeviceToDevice도 가능
Device 정보 살펴보는 방법
- gpu 프로그래밍은 device에 따라 memory 할당하는 등의 작업을 거치기 때문에 device에 대한 정보가 필수적이다.
int count;
cudaGetDeviceCount(&count);
- 이렇게 cudaGetDeviceCount를 이용하여 device 정보를 개수를 얻는다.
int main(void) {
cudaDeviceProp prop;
int count;
cudaGetDeviceCount(&count);
for (int i =0 ; i < count ;i++){
cudaGetDevicePropoerties(&prop, i));
}
}
- count 만큼 for loop을 돌면서 cudaGetDevicePropoerties로 정보를 얻는다.
- 각 loop에 들어있는 정보는 cudaDeviceProp 이라는 struct를 통해 어떤 것들이 있는지 살펴볼 수 있다.
- global memory의 양, block당 shared memory의 양 등의 정보가 담겨 있다.
- 호출하고 싶을 때는,
prop.totalGlobalMem
prop.totalConstMem
와 같이 사용할 수 있다.
반응형
'Programming > CUDA' 카테고리의 다른 글
[CUDA] Constant Memory 와 이벤트 (0) | 2023.05.02 |
---|---|
[CUDA] CUDA로 threading & shared memory (0) | 2023.05.02 |
[CUDA] Parallel Programming in CUDA (0) | 2023.05.01 |
[CUDA] GPU Programming을 하는 이유 (0) | 2023.05.01 |