我一直无法理解何时使用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类型吗?
答案 0 :(得分:4)
这些cl_
- 前缀类型的重点是OpenCL运行时在主机和设备上定义的大小相同。实际上,对于float
之类的简单类型,您通常可以在不使用cl_float
的情况下离开(因为float
和cl_float
通常具有相同的大小),但它始终是建议使用cl_
- 前缀类型以获得最大的可移植性。正如the comments中指出的那样(感谢@DarkZeros),一个可能导致问题的类型的一个很好的例子是int
,因为它的大小可能因主机平台而异。使用cl_int
意味着这不是问题。
正如您链接到的文档中所指出的,OpenCL C基于C99,具有特定的扩展和限制(我听说它被描述为“超级集”:-)。除了确保类型的大小匹配之外,您还限制自己使用OpenCL C中定义的类型(例如size_t
没有匹配的cl_size_t
)。 / p>
就您的示例而言,缓冲区的大小与正在执行的读取和写入的大小相同,但潜在的问题是设备可能具有不同大小的float
类型,因此您的内核可能会正在处理垃圾值。我会将float
的所有实例更改为cl_float
,以防止出现这种可能性。