CUDA和OpenCL异同点比较
2014-12-16 21:25
197 查看
CUDA和OpenCL异同点比较
一、概述
对CUDA和opencl有一定的编程经验,但是细心的人可以发现,OPENCL就是仿照CUDA来做的。既然两个GPU的编程框架如此相像,那么他们究竟有什么不同呢?下面就一一道来。二、数据并行的模型
OpenCL采用的数据并行模型就是采用CUDA的数据并行模型。下面的表格反应了CUDA和opencl并行模型之间的映射关系。OpenCL | CUDA |
Kernel函数 | Kernel函数 |
主机程序 | 主机程序 |
N-DRange | 网格 |
工作项 | 线程 |
工作组 | 线程块 |
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中核函数以__kernel开头,对应于CUDA中的__global__。另外,在程序编译方面,CUDA是先编译设备上的代码,然后执行;而OpenCL是在运行时编译。OpenCL启动核函数是通过运行时API调用的,而CUDA是直接通过函数名<<<dimGrid,dimBlock>>>启动的。最后,N-DRange(网格)配置有所不同,CUDA是在函数调用时夹在<<<和>>>之间的参数配置的;OpenCL是用调用clEnqueueNDRangeKernel函数时配置的。五、最后
CUDA和OpenCL之间十分相似,可以说学好一个之后很容易转到另外一个,推荐先学习CUDA,然后学习OpenCL。另外,还有什么不全的地方也希望大家多多指点!相关文章推荐
- 通用计算时代来临 论CUDA与OpenCL的异同
- CUDA与OpenCL编程框架的比较
- 通用计算时代来临 论CUDA与OpenCL的异同
- opencv3UMat介绍,以及测试比较opencl,cuda性能
- OpenCL和CUDA的使用比较
- 通用计算时代来临 论CUDA与OpenCL的异同
- DirectX?OpenGL?CUDA?Stream?OpenCL?
- php empty,isset,is_null比较(差异与异同)
- GPGPU OpenCL/CUDA 高性能编程的10大注意事项
- MERGE 解决 当目标表 与原始表 比较异同,判断insert,update,delete 操作
- 在System.Object中定义的三个比较方法有何异同
- awk比较两个文件的异同
- 【并行计算-CUDA开发】FPGA 设计者应该学习 OpenCL及爱上OpenCL的十个理由
- OpenCL和CUDA全解释
- 一个程序来比较cuda/c在GPU/CPU的运行效率
- OpenCL与CUDA,CPU与GPU
- CUDA 与 OpenCL 区别
- java基础语法(顺便回顾cpp语法并比较与java的异同)
- 高性能计算汇总-Mpi,openMpi,tbb,CUDA,OpenCL等并行计算或cpu,gpu混合计算技术
- opencv,openGL,CUDA,opencl区别&&一些名词的区别