目前,NVIDIA和AMD的Windows driver均有支援OpenCL(NVIDIA的正式版driver是从195.62版开始,而AMD则是从9.11版开始)。NVIDIA的正式版driver中包含
OpenCL.dll,因此可以直接使用。AMD到目前为止,则仍需要安装其SDK才有OpenCL.dll档。不过,在最新的SDK中,NVIDIA和AMD使用的calling convention是相
同的。也就是说,使用AMD的SDK编译的OpenCL程式,可以直接在NVIDIA的driver下运作。反过来也是一样。
AMD的OpenCL SDK是在AMD Stream SDK 2.0里面,目前是beta 4。NVIDIA的OpenCL SDK则包括在最新的CUDA 3.0 SDK beta中。两个SDK可以同时安装在同一
部电脑中,基本上不会有冲突的问题。
由于OpenCL SDK的重点只是在header file和程式库,因此设定上是很单纯的。在AMD的SDK中,会建立一个环境变数 ATISTREAMSDKROOT。Header files就在include
目录中,而程式库档案则在lib里面。NVIDIA的SDK也是类似,有一个环境变数 NVSDKCOMPUTE_ROOT。不过,因为NVIDIA的SDK同时包括CUDA及OpenCL,因此它
的header files是 在OpenCL\common\inc目录里,而程式库则是在OpenCL\common\lib里面。
关于程式库的部份,还有一点特别需要注意的是,AMD和NVIDIA都有提供32 bits及64 bits的程式库,供32 bits及64 bits的程式使用。NVIDIA的SDK中,32 bits的程式
库是在lib目录下的Win32目录里,而64 bits的则是在x64目录里。AMD的SDK中,则分别是在x86及x86_64目录里。
以下是使用Visual Studio 2008 Express 设定的范例:
NVIDIA 的CUDA SDK:
特别注意的是,因为NVIDIA的SDK在区分32 bits及64 bits版本程式库所使用的目录名称(Win32及x64)和Visual Studio 2008内建的$(PlatformName)是一致的,
因此可以直接使用。AMD的SDK就要分别设定了。另外,如果使用的是32 bits的SDK,则不包括64 bits的library,因此路律就不需要再加上$(PlatformName)。
以下是AMD SDK 的设定方式:
最后再顺便提到一个小地方。在MacOS X 10.6 中,OpenCL 的header 档是存在OpenCL 目录中,也就是
#include <OpenCL/opencl.h>
但是在Windows 下(以及可能所有其它的OS 下),都是
#include <CL/cl.h>
因此,如果想要让同一个程式码,可以同时在各种OS 下都能编译的话,在include 档案时,建议写成:
#ifdef __APPLE__#include <OpenCL/opencl.h>#else#include <CL/cl.h>#endif
这样就可以同时在MacOS X 10.6 下,以及其它的OS 下都能使用了。