首页 > 解决方案 > OpenCL 矢量组件

问题描述

我对我的内核代码有疑问。
所以我知道你不能访问带有[]方括号的内核中的向量组件,例如 example 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*/
    }


}

标签: c++kernelopencl

解决方案


关于这方面的详细信息可以在规范中找到,见6.1.7。矢量组件。简而言之,对于int4 ,组件被命名为xyzw,对于您的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}

推荐阅读