1.内核函数的整体结构就像是一个正常的C函数,他也是由函数名,括号所包含的参数列表以及花括号所包含的可执行的语句所构成,但两者之间还是有以下三个主要不同点:
(1)每个内核函数的声明都是以_kernel开头;
(2)每个内核函数的返回类型都必须是void类型;
(3)有些平台将会拒绝编译那些不带参数的内核函数;
2.内核函数并不需要单独保存在另外的文件中,关键词_kernel实际上是提醒编译器,这个函数将会在设备,并非主机上运行。函数clSetKernelArg能够为内核设置参数,但却没有哪个函数能够访问内核函数的返回值。因为内核函数根本没有返回值–内核函数的返回值类型是void型。一个内核函数只能是通过其参数来访问数据、返回数据,如果编译的函数没有参数,有些编译器会运行报错。
3.和一般的C函数一样,内核函数也可以通过值传递和引用传递这两种方式来传递参数:
(1)如果是值传递,需要提供实际的数据,char型,int型,还是float型数据。内核参数不支持复合结构体。
(2)如果是引用传递,需要提供一个指针,指向数据所在的设备内存空间(一般是一个内存对象)
4.所有传递给内核的指针都必须经过地址空间限定符的处理。这将告诉设备,保存参数的地址空间的情况。四个
地址空间限定符:__global