OpenCL中image2d_t和image2d_array_t有什么区别?

时间:2017-02-02 10:45:05

标签: opencl

OpenCL中image2d_t和image2d_array_t数据类型有什么区别? 我在规范中找不到太多信息。

1 个答案:

答案 0 :(得分:2)

image2d_t是具有特定格式和大小的平面2D图像。如果cl_khr_mipmap_image扩展程序可用(https://www.khronos.org/registry/OpenCL/sdk/2.0/docs/man/xhtml/cl_khr_mipmap_image.html),它还可能包含mipmap级别。

image2d_array_t是一个大小和类型相同的图像数组。看一下https://www.khronos.org/registry/OpenCL/sdk/2.0/docs/man/xhtml/cl_image_desc.html,了解如何创建这样的图像数组。从这个页面:

  

请注意,使用image_array_size = 1从内核读取和写入2D图像数组的性能可能低于2D图像。

所以你应该只在需要时使用图像数组。

有关如何从内核访问image2d_timage2d_array_t,请参阅https://www.khronos.org/registry/OpenCL/sdk/2.0/docs/man/xhtml/read_imagef2d.html。对于图像数组,所需图像的索引将位于z纹理坐标中。对于image2d_timage2d_array_t,mipmap级别被指定为lod的{​​{1}}参数。

如果您需要将可变数量的图像传递给内核(即在运行时决定),图像数组非常有用,就像在内核中一样,您可以使用{{read_image()查询image2d_array_t中有多少图像。 1}},例如假设您想要将图像阵列中的所有图像平均在一起。

它们对于从内核中索引图像也很有用,例如:根据内核中计算的本地图像统计信息选择边缘锐化掩码(存储在图像数组中)。

在硬件中,get_image_array_size()通常比image2d_array_t更快,并且得到更广泛的支持。但是,image3d_t无法(自动)在数组图像之间采样,而image2d_array_t可以在小数image3d_t位置进行采样。