OpenCL学习笔记(7)--内核函数

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__宏,则为小端设备,反之,则为大端设备。**

发布了19 篇原创文章 · 获赞 20 · 访问量 570

猜你喜欢

转载自blog.csdn.net/INFINALGEORGE/article/details/105137631