wawawaaw
안녕하세요
wawawaaw
전체 방문자
오늘
어제
  • 분류 전체보기 (33)
    • Programming (13)
      • Debugging (0)
      • Linux (5)
      • CUDA (5)
      • Git (1)
    • AI Research (14)
      • Tracking (2)
      • Object Detection (9)
      • Dataset (1)
      • GPU (2)
    • Paper Review (1)
    • 보안 (2)
    • Book Review (0)
    • Etc. (2)
      • 자격증 (1)

인기 글

최근 글

티스토리

반응형
hELLO · Designed By 정상우.
wawawaaw

안녕하세요

[CUDA] CUDA C 기초
Programming/CUDA

[CUDA] CUDA C 기초

2023. 5. 1. 01:04
반응형

기본 함수

  • 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
    'Programming/CUDA' 카테고리의 다른 글
    • [CUDA] Constant Memory 와 이벤트
    • [CUDA] CUDA로 threading & shared memory
    • [CUDA] Parallel Programming in CUDA
    • [CUDA] GPU Programming을 하는 이유
    wawawaaw
    wawawaaw
    안녕하세요.

    티스토리툴바