[CUDA RT Series 3] Adding Vectors

By | 2019-10-02

목차: Series 1 – Index + Methodology (Link)
이전 글: Series 2 –First Image (Link)
다음 글: Series 4 –Classing Up the GPU (Link)

이번 장에서는 “__global__”, “__host__”, “__device__” 사용에 관해서 설명한다. 앞에서 작성한 코드 중 GPU에서 실행될 Function에 “__global__”을 함수 이름 앞에 작성하였다. “__global__”의 경우 GPU에서 실행할 함수를 의미한다. 보통 CPU에서 처음 호출할 함수 앞에 작성한다. “__global__”로 작성된 함수를 호출하여서 연산이 수행하고 완료되는 구간을 Kernel이라고 한다. 여러 개의 “__global__” 함수를 호출하는 경우 여러 개의 Kernel 연산을 수행한 것이다. “__device__”의 경우 “__global__”과 거의 동일하게 GPU에서 연산을 수행할 함수 앞에 작성하게 된다. 하지만, “__global__” 과 달리 보통 GPU에서 호출할 함수 앞에 붙이게 된다. CPU에서 “__device__”로 작성된 함수를 호출하면 실행되지 않는다. “__host__”의 경우 CPU에서 동작할 함수 앞에 붙이게 된다. GPU에서 연산할 수 없으며 오직 CPU에서만 실행할 수 있다.

출처 2에서 Vec3 Class를 만들었다. 해당 Class는 그래픽 관련 연산을 효율적으로 하기 위해 필요한 연산을 포함한다. 이 부분을 CPU/GPU에서 모두 실행할 수 있도록 변경한다. 아래 코드 1은 Vec3 Class를 CPU/GPU에서 모두 사용할 수 있도록 변경한 코드이다.

코드 1: GPU에서 실행 가능하도록 Vec3 함수 변경 코드

위 코드가 기존 CPU 코드와 다른 부분은 “__host__”와 “__device__”라는 문구가 모든 함수 이름 앞에 있는 것이다. “__host__”와 “__device__”를 모두 사용했기 때문에 모든 함수는 CPU와 GPU에서 실행 가능하다는 의미이다. 하지만, “__global__”이 없는 관계로 GPU에서 시작하는 함수는 아니다.

코드 2: Vec3 함수를 사용하기 위한 Main 코드 

코드 2는 새로 작성한 Vec3 Class를 사용하기 위한 Main 코드이다. 기존 Float로 생성한 FrameBuffer (FB) 메모리를 Vec3으로 변경하였다. 추가로 “mkRender”함수 안에 Vec3 함수를 사용하는 것을 확인 할 수 있다.

그림 1: 결과 이미지

NVCC 컴파일러를 사용해서 컴파일 후 실행하면 위 그림 1을 확인 할 수 있다. 이전 글에서 작성한 코드와 동일한 결과이다. 혹시 코드를 원하시는 분이 있을 수도 있어서 아래 출처 3에 CPU/GPU 코드를 공유하였다.

 

성능 측정 결과

그림 2: CPU/GPU 실행 시간 결과

그림 2는 CPU/GPU 성능 측정 결과이다. 이전 글과 동일하게 대부분의 연산이 결과를 파일에 작성하는 부분이기 때문에 CPU/GPU성능에 큰 차이가 없다.

출처

  1. https://devblogs.nvidia.com/accelerated-ray-tracing-cuda/
  2. http://www.realtimerendering.com/raytracing/Ray%20Tracing%20in%20a%20Weekend.pdf
  3. https://github.com/mkblog-cokr/CudaRTSeries

Leave a Reply

Your email address will not be published. Required fields are marked *