CUDA和OpenCL异同点比较

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。另外,还有什么不全的地方也希望大家多多指点!

 

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值