如何在OpenCL中将标量转换/转换为向量(反之亦然)

时间:2017-10-04 03:18:08

标签: c types casting opencl type-conversion

如何在OpenCL中将16元素标量转换为单个向量?

char[16] scalar = .. .. .. ;

char16 vectr = scalar;         //do conversion/casting here. 

我有这个,

char16 vectr = (char16) (scalar[0], scalar[1], scalar[2] ... scalar[15]);

但应该有更有效的方法吗?

并且,如何更好地将矢量转换回标量。

2 个答案:

答案 0 :(得分:2)

你有两个选择:

<强> 1。使用工会。根据OpenCL标准中的6.2.4.1节明确允许这样做。

类似的东西:

union my_type
{
  char scalar[16];
  char16 vector;
};

这样做的好处是对齐肯定是正确的。

缺点是用这个索引到可变长度数组是不方便的。

这使得__local__private中存储的数据更加实用,无论如何这些数据通常都是固定大小。

<强> 2。您可以在指向标量与矢量类型的指针之间进行转换。

向量类型被认为是具有标量类型成员的聚合类型,因此,与C相比,在不放宽OpenCL中的重新解释规则的情况下甚至可以允许这样的强制转换(见6.1.8,6.2.5)< / p>

此代码:

char16 vec = (char16)(1, 2, 3, …);
char* scalar = (char*)&vec;

完全有效。

优点:方便。

缺点:容易出错 - 特别是在忘记正确的地址空间限定符或不符合隐式对齐要求方面。

最后,您可能会意识到您可以访问内置矢量类型的元素,例如使用vectr.s3和类似?通常,这允许您只使用矢量类型,而无需在矢量和数组类型之间切换。

(我指的是标准的v1.2。)

答案 1 :(得分:2)

还有 3rd 方式:使用内置函数(实际上是宏)as_typen()as_type()