OpenCL:首选矢量宽度与原始矢量宽度

时间:2014-08-14 13:03:47

标签: opencl

在我的电脑上使用intel N2820 cpu(具有Intel HD Ghaphics)的简单设备查询opencl程序,给出了以下几行:

CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT: 1
CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG: 1
CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT: 1
CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE:
CL_DEVICE_NATIVE_VECTOR_WIDTH_INT: 1
CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG: 1
CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT: 1
CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE: 0

有人可以解释不同数据类型的提供和本机矢量宽度的含义吗?

1 个答案:

答案 0 :(得分:5)

本机矢量宽度是硬件/ ISA公开的宽度。首选矢量宽度是OpenCL实现/编译器喜欢使用的宽度。这两个值不一定相同。

例如,在我使用英特尔最新OpenCL实现的英特尔至强CPU上,我得到以下值:

CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT:    8
CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT: 1

这告诉我硬件有8个宽的32位浮点向量ALU(即256位AVX),但是我应该使用标量类型编写我的内核(即只有float,而不是{{ 1}})。这是因为OpenCL编译器会将工作项打包到SIMD通道中,并自动利用矢量单元。