CS/CUDA

[CUDA] CUDA(.cu) to SSAS(GPU assembly) compilation with Visual Studio

아이스얼그레이 2022. 5. 17. 22:36

CUDA는 NVCC(Nvida's CUDA Complier)를 사용해서 compile할 수 있습니다.

 

NVCC를 통해 CUDA를 intermediate language인 PTX로 compile할 수 있는데, 이에 대한 방법은 아래 게시글에서 설명하였습니다.

 

2022.05.10 - [프로그래밍/CUDA] - [CUDA] Visual Studio 2022에서 .cu(CUDA 파일) ➡ .ptx(PTX 파일) 변환하기

 

[CUDA] Visual Studio 2022에서 .cu(CUDA 파일) ➡ .ptx(PTX 파일) 변환하기

졸업프로젝트를 하면서 CUDA language를 건들이게 되었습니다. 졸업프로젝트의 목표가 GPGPU 설계인데, GPGPU를 검증하려면 instruction을 넣어서 제대로 동작하는지 확인해야합니다. 그런데 machine language

k-j-w.tistory.com

 

이번 게시글에서는 CUDA를 intermediate language인 PTX가 아닌, machine language로 matching되는 GPU assembly로 compile하는 방법을 알아보겠습니다.

 

Compile 방법이 여러 가지가 있는데, 제가 설명하는 방법이 특정 설정에서는 동작하지 않을 수 도 있습니다.

 

내용중 대부분을 아래 NVIDA Documentation을 참고하여 작성하였습니다.

 

https://docs.nvidia.com/cuda/cuda-binary-utilities/index.html#cuobjdump

 

CUDA Binary Utilities :: CUDA Toolkit Documentation

This document introduces cuobjdump, nvdisasm, cu++filt and nvprune, four CUDA binary tools for Linux(x86, ARM and P9), Windows, Mac OS and Android.

docs.nvidia.com

 

우선 Visual Studio에서 CUDA project를 생성해줍니다. Compile 과정은 VS 내에서 이루어 집니다.

위에있는 CUDA to PTX 게시글에서 project 속성을 변경했는데, 이번에는 Compile output과 NVCC compilation type을 .cubin으로 바꿔줘야 합니다.

 

.cubin은 CUDA의 machine language입니다.

 

1. Compiler Output을 $(ProjectDir)cuda\%(Filename).cubin 로 바꿔줍니다.

 

2. NVCC Compilation Type을 Generate device-only .cubin file(-cubin)로 선택해줍니다.

 

그리고나서 똑같이 솔루션 빌드를 해주면, 1. 에서 설정한 cuda directory에 .cubin 파일이 생성됩니다.

 

여기까지는 CUDA를 .cubin 파일로 compile하는 과정이고, 이제 .cubin을 SASS로 diassemble하는 과정을 살펴보겠습니다.

 

원래 PTX를 compile해서 SASS를 생성하는 방법을 시도했는데, NVIDIA tool kit manual을 보고 따라해봐도 error가 잡히질 않아서 .cubin으로 우회하는 방법을 선택했습니다.

 

 

우선 위 사진에서 보이는 터미널을 클릭해 Power shell을 열어줍니다.

 

 

 

그럼 위와 같이 개발자 Power shell이라는 창이 열립니다. 여기서는 Linux 명령어를 이용해서 동작을 제어할 수 있습니다.

 

cd cuda

 

를 입력해서 cuda directory로 이동합니다. cuda directory에 .cubin 파일이 존재하기 때문에 이 directory로 이동해 주어야 합니다.

 

cuobjdump -sass example.cubin

그리고 위 명령어를 입력해줍니다. cuobjdump는 CUDA binary file(.cubin)을 사람이 읽을 수 있는 format으로 변환해주는 역할을 합니다.

 

 

cuobjdump -sass example.cubin 를 입력하면 위 사진과 같이 machine language와 matching되는 GPU assembly를 얻을 수 있습니다. 다만, NVIDIA에서 SASS에 대한 bit code를 제공하지 않아서 machine language를 해독할 수는 없습니다. NVIDIA 관련 documentation을 보다 보면 내용을 정말 꽁꽁 싸매고 있다는 느낌을 받습니다... Open source는 당연히 없구요..

 

위 사진에 나와있는 SASS instruction가 하는 동작들은 제가 올린 링크에 설명되어있으니 필요하신 분들은 참고하시면 되겠습니다.

'CS > CUDA' 카테고리의 다른 글

[CUDA] CUDA to PTX(intermediate language) compilation with Visual Studio  (0) 2022.05.10