【问题标题】:How can I copy data from an int4 vector into an int8 vector?如何将数据从 int4 向量复制到 int8 向量中?
【发布时间】:2019-09-20 15:36:02
【问题描述】:

我正在尝试编写一个内核,其中一个参数是 int4 类型的 8 元素向量。然后我尝试将向量读入本地内存,然后将数据从向量复制到 int8 向量中。然后我想将 int8 向量存储到输出向量中。

我尝试对 int8 向量的每一半使用两个 int4 向量,但这似乎不起作用。

__kernel void vecload(__global int4* vecA,
                      __global int* vecR) {

int id = get_local_id(0);

__local int4 vA;

vA = vecA[id];

int8 v = (int8)((int4)(vA.s0),(int4)(vA.s1);

vstore8(v, 0, vecR);
}

输出显示 vecA 的第一个元素四次,然后第四个元素也显示四次。它应该显示向量的所有 8 个元素。

【问题讨论】:

  • int4 不是 C 语言中的标准类型,因此它的含义和存储方式取决于您使用的编译器。它的文档应该描述它。
  • 另外,你有一个非 c((并且可能是错误的)语法。
  • 我正在使用 C++ Wrapper 在 OpenCL 中工作
  • 一个 int4 只有四个元素,所以有点不清楚你想要实现什么。在任何情况下,您都在使用 vA.s0,如果 vA,这将显式访问第一个元素。尝试使用 int8 v = (int8)(vA, vA)。

标签: opencl


【解决方案1】:

int4int8 指的是分别包含 4 或 8 个整数的 OpenCL 矢量数据类型。在您的代码中,该行

int8 v = (int8)((int4)(vA.s0),(int4)(vA.s1));

(你忘记了右括号)包含表达式(int4)(vA.s0),它等价于(int4)(vA.s0, vA.s0, vA.s0, vA.s0),导致

int8 v = (int8)(vA.s0, vA.s0, vA.s0, vA.s0, vA.s1, vA.s1, vA.s1, vA.s1);

你想要的是这样的

int8 v = (int8)(vA.s0, vA.s1, vA.s2, vA.s3, vA.s0, vA.s1, vA.s2, vA.s3);

或者如果你想要vecA 中的两个连续元素在v 然后使用

int4 vA = vecA[2*id  ];
int4 vB = vecA[2*id+1];
int8 v = (int8)(vA.s0, vA.s1, vA.s2, vA.s3, vB.s0, vB.s1, vB.s2, vB.s3);

另外,也无需创建vA__local,因为您没有在线程块内共享任何数据。

【讨论】:

    猜你喜欢
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    相关资源
    最近更新 更多