c - 我如何在 OpenCL 中将标量转换/转换为 vector (反之亦然)

标签 c types casting opencl type-conversion

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

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

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

我有这个,

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

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

以及,如何更好地将 vector 转换回标量。

最佳答案

你有两个选择:

<强>1。使用 union 。根据 OpenCL 标准的第 6.2.4.1 节,这是明确允许的。

类似于:

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

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

缺点是用它索引可变长度数组很尴尬。

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

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

vector 类型被认为是具有标量类型成员的聚合类型,因此与 C 相比,OpenCL 中甚至可以允许此类转换,而无需放宽重新解释规则。(请参阅 6.1.8、6.2.5)

这段代码:

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

完全有效。

优点:方便。

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

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

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

关于c - 我如何在 OpenCL 中将标量转换/转换为 vector (反之亦然),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46556471/

相关文章:

java - 为什么可以转换泛型类?

c - getopt 无法识别 c 中的多个命令行标志

c - (.text+0x20) : undefined reference to `main' and undefined reference to function

list - Haskell对函数调用感到沮丧

python - 为什么 Decimal ('0' ) > 9999.0 在 Python 中为真?

C指针和类型转换

c++ - 将字节数组转换为 float

c - OpenMp只有一个线程执行

C - 无法从 for 循环内部保存字符串

java - 在 JDBC 中,何时使用时间、日期和时间戳