개인적으로 하고 있던 프로젝트가 대강 GPU한테 코드 하청하기술인지라 OpenCL을 쓰고 있다가 최근에 백엔드를 Vulkan으로 옮기전 중에 일어난 일인데


glsl이 아닌 기존에 사용하던 컴퓨팅 쉐이더 언어인 OpenCL C를 그대로 사용하게 되었습니다.

glsl, hlsl을 지원하는 컴파일러들은 아직 구조상 Vulkan에서 제공하는 멀티 커널을(대강 CPU에서 부를 수 있는 함수에 이름 붙인 거. glsl, hlsl에서는 main으로 고정입니다.) 팔 수 있었고, 그게 쉐이더 컴파일에서 관리해야 할 핸들의 수를 획기적으로 줄여 주었기 때문입니다.


라이브러리고, GPU에서 실행될 몇몇 연산을 런타임에서 정할 수 있게 해 줄 필요가 있었기 때문에 일단 API FFI로서 사용할 수 있는 clspv라는 컴파일러를 사용하고 있었습니다. 사용자 정의 함수 등을 매크로로 부르게 만들면 편해질 거라 생각했죠.


문제는 여기서 시작됩니다. OpenCL C에서 제공하는 2바이트짜리 부동 소수점 half를 가지고 원자적 연산을 하려 하는데, Vulkan에서는 4바이트짜리 원자 연산밖에 지원을 안 하는지라 우회하겠답시고 포인터 캐스팅을 때렸는데, Vulkan도 아니고 clspv가 그거 컴파일하다가 얼었습니다.


나중에 OpenCL용으로 맞춰진 clang과 llvm을 사용했을 시, 같은 코드에도 불구하고 얼지 않았음을 생각해 보면 일단 이게 clspv에서 만들어 놓은 llvm의 문제임은 보이는데, 이게 왜 얼어버리는지를 잘 모르겠네요.


아 맞다 집들이로 왔습니다. 인사 올립니다.