일단 "Graphic card 를 만드는 제조사에 종속되지 않도록, 순수 OpenCL 을 설치해 보겠어!!!" 라는 다짐을 하고 계신 분이 있다면 말리고 싶다. 아니 불가능하다고 말하고 싶다. 왜냐하면 Khronos group 은 단지 specification 만을 제공하기 때문이다. Khronos 의 OpenCL page 에 가면 header file 은 있는데, source file 이 없다는 데 대해 엄청난 의아함을 느끼게 된다. 나도 source file 찾아보려고 노력해 봤는데, 절대 없었다.

 

단순한 이유다. 이전 글에서도 언급했듯이, Khronos group 에서 제공하는 표준을 구현하는 것은 driver 제조 업체별로 이루어지는 일이기 때문에 source file 이 있으면 그게 더 이상한거다.

 

결국 AMD/ATI card 를 사용하는 사람은 Stream SDK 를 NVidia card 를 사용하는 사람은 CUDA toolkit 을 깔지 않으면 안 되는 상황이 된다. 그리고 구현하는 입장에서도 NVidia 용이냐 AMD/ATI 용이냐에 따라서 서로 다른 실행 파일을 제공해야 한다. 여기에서는 NVidia 를 기준으로 설명하도록 하겠다.

 

일단 http://developer.nvidia.com/ 로 가서 Cuda toolkit page 로 이동한 다음, 자신의 OS 에 맞는 Cuda toolkit 용 graphic card driver 와 CUDA toolkit 을 download 한다. 그리고 그것을 설치한다. 그리고 CUDA toolkit 이 설치된 경로를 확인한다.

 

예를 들어 CUDA 같은 경우에는 다음과 같은 경로에서 OpenCL 의 header 와 library 를 찾을 수 있다.

 

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v3.2\include

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v3.2\lib

 

물론 이 경우는 내 machine 에서의 설치 경로이기 때문에 다른 사람들은 자신만의 경로를 지정해야만 할 것이다.

 

위의 경로를 visual studio 의 VC++ Directories 항목에 추가해 준 다음에 source code 에 다음과 같이 입력하면, OpenCL 을 사용할 준비를 마친 것이다.

 

#include < CL/cl.h >

#pragma comment( lib, "OpenCL" )

 

물론 lib 를 project 속성에서 넣어도 상관은 없다. 이것은 NVidia 나 AMD/ATI 나 동일한 식으로 하면 되는 것으로 알고 있다.

 

해 보진 않았지만 program 의 호환성 보장을 위해서는 NVidiaOpenCL.dll, ATIOpenCL.dll 같은 wrapper 를 따로 만들어서 실행시에 동적으로 loading 할 수 있도록 하는 것이 좋을 것 같다.




최근에 multi-platform platform 에 대응하는 OpenCL 관리자를 만들려고 하다가 보니 모든 종류의 platform 에 대한 lib 를 수집해야 한다는 문제가 발생했다. 예를 들면 다음과 같은 조합이 필요하다.


  • 제조사 : AMD, Intel, NVida.
  • 기기 : Desktop, Notebook.
  • 운영체제 : Windows XP, Windows 7.


물론 더 많은 제조사가 존재하겠지만 게임이 돌아 갈 만한 환경은 저 정도가 되겠다. 이 경우 3 X 2 X 2 = 12 개의 조합이 나온다. 아무리 생각해도 이건 좀 아니다 싶은 상황이 되었다.


모든 platform 에서 돌아 갈 수 있는 프로그램을 만들기 위해서는 좀 더 많은 고민이 필요할 것 같다.




OpenCL.lib 는 static library 가 아니고 import library 였다. Multi-platform 에 대응하기 위해서는 해당 platform 을 위해 배포된 OpenCL.dll 을 직접 LoadLibrary() 로 부른 다음에 GetModuleHandle() 을 통해서 API 를 획득하는 방식을 취해야 할 것 같다.


+ Recent posts