OpenCL与CUDA的不同
这样说,CUDA(用runtime api做说明),它的编译过程需要单独安装的一套编译工具,以及,一定的(例如VC)host c compiler,进行host/device混合编译,并将编译得到的host code .obj / device的.cubin/.ptx文件,通过连接器连接成一个exe文件。所以这个过程需要人手工进行。
等你发布的时候,只要目标机器有显卡驱动,(显卡驱动提供driver api支持),同时你的exe附带上runtime的dll(或者从5.5开始可以不附带,直接连接到exe里),这样,只需要有一个exe和一个显卡驱动就能运行,而显卡驱动里无需集成编译器那一堆。
反过来,opencl不同,编译器集成在opencl runtime里面,在用户单独安装后,程序附带上kernel的源代码,现场就地调用runtime中的特性函数进行编译,然后再执行。
正式因为cuda的编译步骤不在运行时刻进行,是单独的分离编译的,而opencl的编译和运行都是直接调用api即可,所以后者更容易在C#之类的使用,(因为只需要简单的调用几个函数即可),而前者却需要有单独的分布的人工的编译的过程,所以后者更容易和C#之类的接口。
但是大部分人都是用C的,而CUDA runtime api提供的直接混合编译,直接得到exe文件,将kernel的编译隐含在了常规的编译过程中,在运行时刻无需单独调用api编译,对C用户来说,cuda更方便。(当然,对C#来说是opencl更方便)