OpenCL 内核函数

本文介绍了OpenCL的内核函数,包括它们与普通C函数的区别,如无返回值、参数传递方式及地址空间限定符。内核函数通过__global, __constant, __local, __private来指定地址空间。此外,文章还讨论了OpenCL中的数据类型、设备的数据总线宽度、字节顺序的处理,以及如何在内核和主机端判断设备的字节序。" 111761080,10293036,Python 并发、并行、同步和异步解析,"['Python', '多线程', '多进程', '并发编程', '同步机制']
部署运行你感兴趣的模型镜像

1.内核函数的整体结构就像是一个正常的C函数,他也是由函数名,括号所包含的参数列表以及花括号所包含的可执行的语句所构成,但两者之间还是有以下三个主要不同点:

1)每个内核函数的声明都是以_kernel开头;
(2)每个内核函数的返回类型都必须是void类型;
(3)有些平台将会拒绝编译那些不带参数的内核函数;

2.内核函数并不需要单独保存在另外的文件中,关键词_kernel实际上是提醒编译器,这个函数将会在设备,并非主机上运行。函数clSetKernelArg能够为内核设置参数,但却没有哪个函数能够访问内核函数的返回值。因为内核函数根本没有返回值–内核函数的返回值类型是void型。一个内核函数只能是通过其参数来访问数据、返回数据,如果编译的函数没有参数,有些编译器会运行报错。

3.和一般的C函数一样,内核函数也可以通过值传递和引用传递这两种方式来传递参数:

1)如果是值传递,需要提供实际的数据,char型,int型,还是float型数据。内核参数不支持复合结构体。
(2)如果是引用传递,需要提供一个指针,指向数据所在的设备内存空间(一般是一个内存对象)

4.所有传递给内核的指针都必须经过地址空间限定符的处理。这将告诉设备,保存参数的地址空间的情况。四个
地址空间限定符:__global,__constant,__local,以及__private.

5.在设备执行完所入列的内核函数之后,主机程序将调用clEnqueueReadBuffer函数来访问缓存数据。

6.Opencl标量数据类型:

int--补码表示的32位有符号整数
unsigned int/uint--补码表示的32位无符号整数
size_t--操作符大小得到的无符号整数
void--无类型数据

7.如果设备支持cl_khr_fp64扩展,内核函数便尽可能使用double数据类型,如果不支持,内核函数将改用float类型。

8.主机程序还将检查目标设备的数据总线宽度,这点对于在比特水平上处理size_t,ptrdiff_t类型的数据而言十分重要,size_t/ptrdiff_t类型的数据在64位系统和32位系统上分别为64位宽和32位宽。

9.如果数据操作涉及字节顺序,例如用指针访问数据,便需要确定目标设备的字节顺序,这个参数将说明内存地址高位低位存储的相对关系。X86设备都是小端模式(04,03,02,01)的数据存储结构,大端模式为(01,02,03,04).

10.确定设备是大端顺序还是小端模式一般有两种方法:在主机端,调用clGetDeviceInfo函数,设置CL_DEVICE_ENDIAN_LITTLE参数即可,如果返回值为CL_TRUE,说明设备为小端顺序,CL_FALSE则为大端模式。

11.内核端可以用#ifdef的办法来确定__ENDIAN_LITTLE__宏是否被定义。如果设备定义了__ENDIAN_LITTLE__宏,则为小端设备,反之,则为大端设备。**

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值