CUDA和OpenCL异同点比较
来源:互联网 发布:南极金字塔 知乎 编辑:程序博客网 时间:2024/06/04 19:35
CUDA和OpenCL异同点比较
一、概述
对CUDA和opencl有一定的编程经验,但是细心的人可以发现,OPENCL就是仿照CUDA来做的。既然两个GPU的编程框架如此相像,那么他们究竟有什么不同呢?下面就一一道来。
二、数据并行的模型
OpenCL采用的数据并行模型就是采用CUDA的数据并行模型。下面的表格反应了CUDA和opencl并行模型之间的映射关系。
OpenCL
CUDA
Kernel函数
Kernel函数
主机程序
主机程序
N-DRange
网格
工作项
线程
工作组
线程块
说道N-DRange、工作项和工作组,这里CUDA和opencl十分相似,甚至可以说是一样的,在设备端的程序中,CUDA主要是通过预定义的变量进行访问,而OpenCL是通过预定义的API访问。具体的比较如下表:
OPENCL
含义
CUDA
get_global_id(0)
工作项在X维度上的全局索引
blockIdx.x*blockDim.x+threadIdx.x
get_local_id(0)
工作项在工作组中X维度上的局部索引
threadIdx.x
get_global_size(0)
N-DRange中X维度的大小,即线程数量
gridDim.x*blockDim.x
get_local_size(0)
每个工作组X维度上的大小
blockDim.x
三、设备体系结构
CUDA和OpenCL类似,都是异构并行计算系统。系统中有一台主机和一个或多个计算设备。关于计算设备,CUDA中叫做多喝流处理器(SM),而OpenCL中叫做计算单元(CU)。另外,在OpenCL中一个CU在CPU中相当于CPU的一个内核。
另外,CUDA和OpenCL之间在内存模型上有一些相似的地方,也有一些不同的地方,具体见下表:
OpenCL存储器类型
主机访问
设备访问
CUDA存储器类型
全局存储器
动态分配;读写
不能分配;可以被所有的工作项访问,空间大;速度慢
全局存储器
常数存储器
动态分配;读写
静态分配,工作项只读
常数存储器
局部存储器
动态分配;不能访问
静态分配;同一个工作组的工作项访问
局部存储器
私有存储器
不能分配;不能访问
静态分配;每一个工作项可读写自己的部分
寄存器和局部存储器
有几点不同的地方,OpenCL可以再主机端动态的分配常数存储器;OpenCL中的私有存储器对应于CUDA中的自动变量。
四、核函数以及启动
OpenCL中核函数以__kernel开头,对应于CUDA中的__global__。另外,在程序编译方面,CUDA是先编译设备上的代码,然后执行;而OpenCL是在运行时编译。OpenCL启动核函数是通过运行时API调用的,而CUDA是直接通过函数名<<<dimGrid,dimBlock>>>启动的。最后,N-DRange(网格)配置有所不同,CUDA是在函数调用时夹在<<<和>>>之间的参数配置的;OpenCL是用调用clEnqueueNDRangeKernel函数时配置的。
五、最后
CUDA和OpenCL之间十分相似,可以说学好一个之后很容易转到另外一个,推荐先学习CUDA,然后学习OpenCL。另外,还有什么不全的地方也希望大家多多指点!
- CUDA和OpenCL异同点比较
- OpenCL和CUDA简单比较
- OpenCL和CUDA的使用比较
- Opencl和CUDA
- CUDA和OpenCL
- Opencl和CUDA
- CUDA和OpenCL
- CUDA和OpenCL
- OpenCL和CUDA关系
- OpenCL和CUDA关系
- CUDA和OpenCL
- OpenCL 笔记3 OpenCL和CUDA
- OpenCL和CUDA全解释
- OpenCL和CUDA全解释
- CUDA和OpenCL全解释
- CUDA和OpenCL全解释
- CUDA和OpenCL的区别
- CUDA与OpenCL编程框架的比较
- 由前序遍历序列和中序遍历序列重建二叉树
- 第16周OJ-指针(1)
- Unity之本周总结知识点
- Windows环境下Android Studio v1.0安装教程
- 第16周OJ-指针(2)
- CUDA和OpenCL异同点比较
- Unity数据库SQL操作
- overridePendingTransition
- Android Studio 快捷键整理分享
- Android给scrollView截图超过屏幕大小形成长图
- Unique Snowflakes
- 第16周OJ-指针(3)
- 聊一聊重构这个磨人的小妖精
- Unity之列的基本操作和约束