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

时间:2014-08-20 06:53:39

标签: c types opencl

我一直无法理解何时使用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类型吗?

1 个答案:

答案 0 :(得分:4)

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

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

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