CUDA custom C++ extensions 개발

yeonsoo·2022년 11월 22일
0

Plenoxel을 건드리는 과정에서 생전 접한적 없던 CUDA C를 이용한 custom CUDA kernel을 수정, 개발하게 되었음.

사실 작업 시작한지 좀 돼서 기본적인 공부는 자료정리 없이 읽어보고 만져보고 시행착오를 반복한 끝에 어느정도 된 것 같은데 지금부터라도 조금 정리를 해야 할 것 같아서 개발 과정에서 새롭게 찾아보거나 문제가 생긴 부분을 틈틈이 메모처럼 남겨놓으려고 함

(1) 배열 선언

float *arr;

cudaMalloc((void**)&arr, size);

또는

float *arr[10];

아래가 더 간단하지만 다 알다시피 아래는 컴파일 타임에 배열의 크기가 지정되기 때문에 10이 들어가는 자리에 변수가 들어갈 수 없음. 대부분의 경우 배열 크기가 고정인 경우는 흔치 않으므로.. (내 경험 상 다른 변수.size() 이런 식으로 다른 변수에 종속적인 사이즈를 가지도록 선언해야 하는 경우가 대부분이다) 첫번째를 사용하는 것을 추천!

(2) 텐서 선언

torch::Tensor tensor_ = torch::empty({a,b}, {torch::kFloat64});

주의할 점은 torch::empty를 통한 텐서 선언은 __device__ 함수에서는 불가하다.
torch::empty 는 __host__ 형으로 정의되어 있는데 __host__ 함수는 같은 __host__ 형 함수에서만 사용 가능하고 __device_ 에서는 호출할 수 없기 때문.
이렇게 생성한 tensor
를 꼭 __device__ 함수 내에서 사용해야 한다면 __host__ 함수로부터 입력인자로 넘겨받아 사용하면 될 듯?

텐서 내 성분에 접근할 때는 auto 형을 써주는게 속편하다.

float i = tensor[1]; 하니까 오류나더라. 자세히는 안봤고 그냥 auto i = tensor[1]; 해주는게 간단하고 좋음.

profile
to be enterprising

0개의 댓글