作者:Boy Holy
链接:https://www.zhihu.com/question/19780484/answer/33008684
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

根据网站资料,简单地汇编一下CUDA与OpenCL的区别。如有错误请指出。

题外话: 美国Sandia国家实验室一项模拟测试证明:由于存储机制和内存带宽的限制,16核、32核甚至64核处理器对于超级计算机来说,不仅不能带来性能提升,甚至可能导致效率的大幅度下降。

什么是OpenCL?

是由苹果(Apple)公司发起,业界众多著名厂商共同制作的面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的编程环境。便于软件开发人员为高性能计算服务器、桌面计算系统、手持设备编写高效轻便的代码,而且广泛适用于多核心处理器(CPU)、图形处理器(GPU)、Cell类型架构以及数字信号处理器(DSP)等其他并行处理器,在游戏、娱乐、科研、医疗等各种领域都有广阔的发展前景。

什么是CUDA?

CUDA是一个基于Nvidia GPU的并行计算的架构。CUDA最主要的包含两个方面:一个是ISA指令集架构;第二硬件计算引擎;实际上是硬件和指令集。 也就是说我们可以把CUDA看做是与X86或者cell类似的架构,但是是基于是GPU,而不是传统的CPU。

OpenCL实际上是什么?

  • OpenCL实际上是针对异构系统进行并行编程的一个全新的API,OpenCL可以利用GPU进行一些并行计算的工作。
  • OpenGL是针对图形的,而OpenCL则是针对并行计算的API。
  • OpenCL开发的过程中,技术平台均为NVIDIA的GPU,实际上OpenCL是基于NVIDIA GPU的平台进行开发的。另外OpenCL的第一次演示也是运行在NVIDIA的GPU上。
  • 从本质上来说,OpenCL就是一个相当于Windows平台中DirectX那样的技术。或者说,它是一个连接硬件和软件的API接口。在这一点上,它和OpenGL类似,不过OpenCL的涉及范围要比OpenGL大得多,它不仅是用来作用于3D图形。如果用一句话描述,OpenCL的作用就是通过调用处理器和GPU的计算资源,释放硬件潜力,让程序运行得更快更好。

CUDA实际上是什么?

  • CUDA架构是原生的,专门为计算接口而建造的这样的一个架构,这种硬件架构包括指令集都是非常适合于这种并行计算,为异构计算而设计的一整套的架构。CUDA架构可以支持API,包括OpenCL或者DirectX,同时CUDA还支持C、C++语言,还包括Fortran、Java、Python等各种各样的语言。

OpenCL与CUDA的关系是什么?

  • CUDA和OpenCL的关系并不是冲突关系,而是包容关系。OpenCL是一个API,在第一个级别,CUDA架构是更高一个级别,在这个架构上不管是OpenCL还是DX11这样的API,还是像C语言、Fortran、DX11计算,都可以支持。作为程序开发员来讲,一般他们只懂这些语言或者API,可以采用多种语言开发自己的程序,不管他选择什么语言,只要是希望调用GPU的计算能,在这个架构上都可以用CUDA来编程。
  • 关于OpenCL与CUDA之间的技术区别,主要体现在实现方法上。基于C语言的CUDA被包装成一种容易编写的代码,因此即使是不熟悉芯片构造的科研人员,也可能利用CUDA工具编写出实用的程序。而OpenCL虽然句法上与CUDA接近,但是它更加强调底层操作,因此难度较高,但正因为如此,OpenCL才能跨平台运行。
  • CUDA是一个并行计算的架构,包含有一个指令集架构和相应的硬件引擎。OpenCL是一个并行计算的应用程序编程接口(API),在NVIDIA CUDA架构上OpenCL是除了C for CUDA外新增的一个CUDA程序开发途径。
  • 如果你想获得更多的对硬件上的控制权的话,你可以使用OpenCL这个API来进行编程,如果对API不是太了解,也可以用CUDA C语言来编程,这是两种不同编程的方式,他们有他们相同点和不同点。但是有一点OpenCL和CUDA C语言进行开发的时候,在并行计算这块,他们的概念是差不多的,这两种程序在程序上是有很大的相似度,所以程序之间的相互移植相对来说也是比较容易。
  • CUDA C语言与OpenCL的定位不同,或者说是用人群不同。CUDA C是一种高级语言,那些对硬件了解不多的非专业人士也能轻松上手;而OpenCL则是针对硬件的应用程序开发接口,它能给程序员更多对硬件的控制权,相应的上手及开发会比较难一些。
  • 程序员的使用习惯也是非常重要的一方面,那些在X86 CPU平台使用C语言的人员,会很容易接受基于CUDA GPU平台的C语言;而习惯于使用OpenGL图形开发的人员,看到OpenCL会更加亲切一些,在其基础上开发与图形、视频有关的计算程序会非常容易。

给点实例看看?

  • OpenCL 教學: http://www.kimicat.com/opencl-1/opencl-jiao-xue-yi

    • 在 Windows 下使用 OpenCL: http://www.kimicat.com/opencl-1/zai-windows-xia-shi-yong-opencl
    • 在 Xcode 中使用 OpenCL: http://www.kimicat.com/opencl-1/zai-xcode-zhong-shi-yong-opencl
  • CUDA 教学: http://www2.kimicat.com/cuda%E7%B0%A1%E4%BB%8B
谈CUDA和OpenCL的差异和发展前景

观点1

从很多方面来看,CUDA和OpenCL的关系都和DirectX与OpenGL的关系很相像。如同DirectX和OpenGL一样,CUDA和OpenCL中,前者是配备完整工具包、针对单一供应商(NVIDIA)的成熟的开发平台,后者是一个开放的标准。 
虽然两者抱着相同的目标:通用并行计算。但是CUDA仅仅能够在NVIDIA的GPU硬件上运行,而OpenCL的目标是面向任何一种Massively Parallel Processor,期望能够对不同种类的硬件给出一个相同的编程模型。由于这一根本区别,二者在很多方面都存在不同: 
1、开发者友好程度。CUDA在这方面显然受更多开发者青睐。原因在于其统一的开发套件(CUDAToolkit, NVIDIA GPU Computing SDK以及NSight等等)、非常丰富的库(cuFFT,cuBLAS, cuSPARSE, cuRAND, NPP, Thrust)以及NVCC(NVIDIA的CUDA编译器)所具备的PTX(一种SSA中间表示,为不同的NVIDIA GPU设备提供一套统一的静态ISA)代码生成、离线编译等更成熟的编译器特性。相比之下,使用OpenCL进行开发,只有AMD对OpenCL的驱动相对成熟。 
2、跨平台性和通用性。这一点上OpenCL占有很大优势(这也是很多National Laboratory使用OpenCL进行科学计算的最主要原因)。OpenCL支持包括ATI,NVIDIA,Intel,ARM在内的多类处理器,并能支持运行在CPU的并行代码,同时还独有Task-Parallel Execution Mode,能够更好的支持Heterogeneous Computing。这一点是仅仅支持数据级并行并仅能在NVIDIA众核处理器上运行的CUDA无法做到的。 
3、市场占有率。作为一个开放标准,缺少背后公司的推动,OpenCL显然没有占据通用并行计算的主流市场。NVIDIA则凭借CUDA在科学计算、生物、金融等领域的推广牢牢把握着主流市场。再次想到OpenGL和DirectX的对比,不难发现公司推广的高效和非盈利机构/标准委员会的低效(抑或谨慎,想想C++0x)。 
我接触的很多开发者(包括我本人)都认为,由于目前独立显卡市场的萎缩、新一代处理器架构(AMD的Graphics Core Next (GCN)、Intel的Sandy Bridge以及Ivy Bridge)以及新的SIMD编程模型(Intel的ISPC等)的出现,未来的通用并行计算市场会有很多不确定因素,CUDA和OpenCL都不是终点,我期待未来会有更好的并行编程模型的出现(当然也包括CUDA和OpenCL,如果它们能够持续发展下去)。

观点2

1、CUDA有远好于OpenCL的生态系统,更易用,对程序员更友好。OpenCL的API设计怪异,缺乏一致性,功能亦不正交,很不直观,远未成熟。
2、OpenCL的portability被夸大了,事实上根据我的经验,AMD和NV的OpenCL实现,组合行为是有差异的,并且有些十分隐蔽,难于调试。而且同样的代码在AMD和NV是有性能差异的,有时候差异非常大,为了一致的性能不得不写两套代码。如果有更多的vendor呢?
3、OpenCL作为开放的标准,完全依赖于厂商的实现,不同厂商支持标准不同。如果NV放弃支持OpenCL,那它还是通用的开放的标准吗?
4、即使NV倒闭,会有OpenCUDA出现的。
现在AMD在推新的HSA,其IL类似NV的PTX,不知是何用意。Java会在未来(JAVA 9? 2015?)支持NV/AMD GPU加速。OpenCL的美好只存在于未来,问题是这个未来有多远。

观点3

1、CUDA和OpenCL的关系并不是冲突关系,而是包容关系。OpenCL是一个API,在第一个级别,CUDA架构是更高一个级别,在这个架构上不管是OpenCL还是DX11这样的API,还是像C语言、Fortran、DX11计算,都可以支持。作为程序开发员来讲,一般他们只懂这些语言或者API,可以采用多种语言开发自己的程序,不管他选择什么语言,只要是希望调用GPU的计算能,在这个架构上都可以用CUDA来编程。
2、关于OpenCL与CUDA之间的技术区别,主要体现在实现方法上。基于C语言的CUDA被包装成一种容易编写的代码,因此即使是不熟悉芯片构造的科研人员,也可能利用CUDA工具编写出实用的程序。而OpenCL虽然句法上与CUDA接近,但是它更加强调底层操作,因此难度较高,但正因为如此,OpenCL才能跨平台运行。
CUDA是一个并行计算的架构,包含有一个指令集架构和相应的硬件引擎。OpenCL是一个并行计算的应用程序编程接口(API),在NVIDIA CUDA架构上OpenCL是除了C for CUDA外新增的一个CUDA程序开发途径。
3、如果你想获得更多的对硬件上的控制权的话,你可以使用OpenCL这个API来进行编程,如果对API不是太了解,也可以用CUDA C语言来编程,这是两种不同编程的方式,他们有他们相同点和不同点。但是有一点OpenCL和CUDA C语言进行开发的时候,在并行计算这块,他们的概念是差不多的,这两种程序在程序上是有很大的相似度,所以程序之间的相互移植相对来说也是比较容易。

4、CUDA C语言与OpenCL的定位不同,或者说是用人群不同。CUDA C是一种高级语言,那些对硬件了解不多的非专业人士也能轻松上手;而OpenCL则是针对硬件的应用程序开发接口,它能给程序员更多对硬件的控制权,相应的上手及开发会比较难一些。

5、程序员的使用习惯也是非常重要的一方面,那些在X86 CPU平台使用C语言的人员,会很容易接受基于CUDA GPU平台的C语言;而习惯于使用OpenGL图形开发的人员,看到OpenCL会更加亲切一些,在其基础上开发与图形、视频有关的计算程序会非常容易。

OpenCL与Cuda相关推荐

  1. GPU编程语言选择(OpenCL、CUDA 与C++ AMP)

    其实在C++ AMP之前已经有了两个异构编程框架:CUDA与OpenCL.CUDA(Compute Unified Device Architecture)是显卡厂商Nvidia于2007年推出的业界 ...

  2. OpenCL 与 CUDA

    根据网站资料,简单地汇编一下CUDA与OpenCL的区别.如有错误请指出. 题外话: 美国Sandia国家实验室一项模拟测试证明:由于存储机制和内存带宽的限制,16核.32核甚至64核处理器对于超级计 ...

  3. OpenCL和CUDA全解释

    Khronos组织最近规范了OpenCL 1.0, OpenCL实际上是针对异构系统进行并行编程的一个全新的API,简单来说OpenCL它可以利用GPU,然后进行一些并行计算这方面的工作,这是API应 ...

  4. 使用显卡程序加速(opencl、cuda)

    opencl源码 https://gitee.com/mirrors/hashcat.git CPU使用冯诺依曼结构,缓存大,处理单元少 GPU处理图像每个像素可以单独处理,缓存小,处理单元很多 op ...

  5. OpenCL与CUDA,CPU与GPU

    OpenCL OpenCL(全称Open Computing Language,开放运算语言)是第一个面向异构系统通用目的并行编程的开放式.免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计 ...

  6. Ubuntu 20.04显卡驱、cuda和cudnn安装以及OpenCV3.3.1的加上openCL和cuda功能编译

    文章目录 一.显卡驱动安装 1.1 卸载Ubuntu的SoftWare Update中安装的显卡驱动和将neavue黑名单 二.cuda安装注意事项和错误解决 三.编译OpenCV错误解决 一.显卡驱 ...

  7. VS2015 + CUDA 8.0 配置GTX1070的OpenCL 开发环境

    一.查看计算机对OpenCL异构计算的支持情况 使用 GPU Caps Viewer 查看计算机对OpenCL的支持情况,目前最新的版本是 gpu-caps-viewer-1-32-0, 下载地址:h ...

  8. 从CUDA开始读OpenCL

    就像大一学C++,大二学汇编一样,我也写弄了些个月的CUDA,然后,想想,应该开始刨根问底地,去学点在CUDA之下层的东西,可能会对异构这个编程了解的多. 1 简介 OpenCL全称:开发计算语言,是 ...

  9. CUDA与OpenCL架构

    原文https://www.cnblogs.com/hlwfirst/p/5003504.html CUDA与OpenCL架构 目录 CUDA与OpenCL架构 目录 1 GPU的体系结构 1.1 G ...

最新文章

  1. linux crond命令
  2. 深度学习框架TensorFlow(4.Fetch and Feed)
  3. java 枚举 菜鸟_2个菜鸟Java常量和枚举陷阱
  4. MachineLearning(9)-最大似然、最小KL散度、交叉熵损失函数三者的关系
  5. 一步步实现SDDC--多角色服务器部署
  6. mybatis添加方法可以传map吗_Mybatis创建方式二
  7. 【光学】基于matlab夫琅禾费圆孔衍射【含Matlab源码 062期】
  8. STM32基础知识(二)
  9. mysql2008 密钥_怎么查看sql server 2008密钥
  10. 蓝桥杯python试题_Python爬取蓝桥杯真题讲解课程
  11. 在vue项目中使用骨架屏
  12. 飞鱼科技<校招开发面试官>面试经验分享
  13. Echarts 柱状图渐变色设置
  14. 阿里云改名并下载文件,乱码问题解决
  15. Excel 表列序号
  16. Java编程环境搭建
  17. Blocked a frame with origin “https://my.xxxxxxx.com“ from accessing a cross-origin frame.
  18. 接口自动化-接口自动化测试注意情况
  19. 分页计算起始页和总页数
  20. 动态网站开发(应该怎么做啊)

热门文章

  1. centos桌面进入服务器,解决如何在centos7桌面中打开终端_网站服务器运行维护
  2. 计算机jsp外文文献,计算机 JSP web 外文翻译 外文文献 英文文献.doc
  3. android源码编译 简书,android学习笔记之源码编译
  4. c语言哈希表电子辞典_关于redis涉及的知识点,C语言如何操作redis
  5. mule_Mule ESB,ActiveMQ和DLQ
  6. fmt打印不显示 go_golang打印输出fmt和log
  7. java if 三目运算符_if-else和三元运算符的不同行为
  8. JAVA 和 GO 真香!谁用谁知道!
  9. Nginx 一个牛 X 的功能,流量拷贝!
  10. Spring Boot + Redis 实现接口幂等性 | 分布式开发必知!