【问题标题】:How may I convert/cast scalar to vector (and vice versa) in OpenCL如何在 OpenCL 中将标量转换/转换为矢量(反之亦然)
【发布时间】:2023-03-27 22:37:02
【问题描述】:

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

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

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

我有这个,

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

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

还有,如何更好地将向量转换回标量。

【问题讨论】:

标签: c types casting opencl type-conversion


【解决方案1】:

你有两个选择:

1.使用工会。根据 OpenCL 标准中的第 6.2.4.1 节,这是明确允许的。

类似:

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

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

缺点是用 this 索引可变长度数组很麻烦。

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

2。您可以在指向标量和向量类型的指针之间进行转换。

向量类型被认为是具有其标量类型成员的聚合类型,因此与 C 相比,在不放宽 OpenCL 中重新解释规则的情况下,甚至允许这种类型转换。(参见 6.1.8、6.2.5)

这段代码:

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

完全有效。

优点:方便。

缺点:容易出错——尤其是在忘记正确的地址空间限定符或不满足隐式对齐要求方面。

最后,您大概知道您可以访问内置向量类型的元素,例如使用vectr.s3 和类似的?这通常允许您在整个过程中只使用向量类型,而无需在向量和数组类型之间切换。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-03-28
      • 1970-01-01
      • 2011-07-27
      • 2021-06-10
      • 2012-03-24
      • 2018-06-28
      • 2010-12-04
      • 2012-01-15
      相关资源
      最近更新 更多