何时使用OpenCL API标量数据类型?

我一直无法理解何时使用cl_float,cl_uchar等OpenCL API数据类型,可在此处找到:

http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/scalarDataTypes.html

我看到的涉及将缓冲区复制到设备的示例如下所示:

float data[DATA_SIZE]; // original data set given to device //Create the input and output arrays in device memory for our calculation input = clCreateBuffer(context, CL_MEM_READ_ONLY, sizeof(float) * count, NULL, // Write our data set into the input array in device memory err = clEnqueueWriteBuffer(commands, input, CL_TRUE, 0, sizeof(float) * count, data, 0, NULL, NULL); if (err != CL_SUCCESS) { printf("Error: Failed to write to source array!\n"); exit(1); } 

此代码直接取自此处提供的Apple代码示例: https : //developer.apple.com/library/mac/samplecode/OpenCL_Hello_World_Example/Listings/ReadMe_txt.html

您将在上面的代码中注意到一个浮点数组被复制到设备中。 为什么这不需要是一个cl_floats数组? 内存是直接复制的,对吧? 如果主机浮动且设备浮动的大小不同,会发生什么?

你能解释为什么没有必要使用cl_float吗? 如果在这种情况下没有必要,那么何时应该使用opencl类型?

这些cl_ -prefixed类型的重点是OpenCL运行时在主机和设备上定义的大小相同。 在实践中,对于简单类型(如float您通常可以在不使用cl_float情况下cl_float (因为floatcl_float通常具有相同的大小),但始终建议使用cl_ -prefixed类型以获得最大的可移植性。 正如评论中所指出的那样(感谢@DarkZeros),一个可能导致问题的类型的一个很好的例子是int ,因为它的大小可能因主机平台而异。 使用cl_int意味着这不是问题。

正如您链接到的文档中所指出的,OpenCL C基于具有特定扩展和限制的 C99(我听说它被描述为“超级集”:-)。 除了确保类型的大小匹配之外,您还限制自己使用OpenCL C中定义的类型(例如, size_t没有匹配的cl_size_t )。

就您的示例而言,缓冲区的大小与正在执行的读取和写入的大小相同,但潜在的问题是设备可能具有不同大小的float类型,因此您的内核可能正在处理垃圾值。 我会将float所有实例更改为cl_float以防止这种可能性。