【问题标题】:OpenCL Vector componentsOpenCL 向量组件
【发布时间】:2019-12-02 18:07:45
【问题描述】:

我对我的内核代码有疑问。
所以我知道您无法使用[] 方括号访问内核中的向量组件,例如vec[2]

还有哪些其他方法可以访问它?假设我需要检查向量元素值是否大于某个值?

我正在编写一个将Array1 解析为本地内存向量v 的内核, 检查v 中的任何元素是否大于 5,如果是,则添加到另一个向量调用结果中。

关于访问内核中的向量组件有什么建议吗?

__kernel void copy(__global int4* Array1, 
               __global int* Array2,
               __global int8* output
                ) 
{

    int id = get_global_id(0);

    __local int4 v;

    v = Array1[id];


    int8 v1 = vload8(0, Array2);
    int8 v2 = vload8(1, Array2);

    int8 results;


    /* My problem is here where i want to check if the current v[i] is more than 5, 
    if so add v1[i] into results, else add v2[i].*/


    if (any(v > 5)) {

             results.s0 = select(v2.s0, v1.s0, isgreater(v.s0, 5.0));
             results.s1 = select(v2.s1, v1.s1, isgreater(v.s1, 5.0));
             results.s2 = select(v2.s2, v1.s2, isgreater(v.s2, 5.0));
             results.s3 = select(v2.s3, v1.s3, isgreater(v.s3, 5.0));
             results.s4 = select(v2.s4, v1.s4, isgreater(v.s4, 5.0));
             results.s5 = select(v2.s5, v1.s5, isgreater(v.s5, 5.0));
             results.s6 = select(v2.s6, v1.s6, isgreater(v.s6, 5.0));
             results.s7 = select(v2.s7, v1.s7, isgreater(v.s7, 5.0));

             vstore8(results, 0, output);

    }
    else {
        /*does some other stuff that i haven't get to*/
    }


}

【问题讨论】:

  • 您可以将向量组件的基地址转换为适当的指针类型(int*),然后可以使用括号。

标签: c++ kernel opencl


【解决方案1】:

有关此的详细信息可以在规范中找到,请参阅6.1.7. Vector Components。简而言之,组件分别命名为xyzwint4 em>,对于您的 int8,您需要使用数字索引:v1.s0v1.s7。您甚至可以同时访问多个组件:

int8 large_vec = vload8(...);
int4 every_second_element = large_vec.s0246;
int last_element = large_vec.s7;
int2 first_elements = large_vec.xy; // Only works for the first four elements, xyzw

组件也可以按任意顺序多次访问:

int4 vec = {1, 2, 3, 4};
int4 backwards = vec.wzyx; // {4, 3, 2, 1}
int4 multiple = vec.xxyy;  // {1, 1, 2, 2}

【讨论】:

  • 我正在学习如何使用内置的选择功能,我想这样使用 results = select(v2[i], v1[i], isgreater(v[i], 5) )。我将如何访问当前的向量索引?
  • select 已经对向量类型进行了操作,因此您不需要此处的索引。 results = select(v1, v2, v > 5) 应该会给你结果。
  • 抱歉 Jan-Gerd 我不能这样做,因为更大的参数必须是浮点数和双精度数等数据类型,我的 v 是一个向量,所以没有匹配的函数调用:(跨度>
  • 我的硬编码方法是单独访问:(我在上面编辑了我的代码以显示
  • 根据规范,isgreater 确实适用于矢量类型。也许我读错了你的问题。你能举一个输入和预期输出的例子吗?
猜你喜欢
  • 2012-02-14
  • 2013-12-15
  • 2012-04-05
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 2017-06-28
  • 1970-01-01
  • 2016-07-24
相关资源
最近更新 更多