我对我的内核代码有疑问。
因此,我知道您无法在带有[]
方括号的内核中访问矢量组件,例如示例vec[2]
。
还有其他访问方式吗?说我需要检查向量元素值是否大于某个值?
我正在编写一个将Array1
解析为本地内存向量v
的内核,
检查v
中的任何元素是否大于5,如果大于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*/
}
}
答案 0 :(得分:0)
关于此的详细信息可以在规范中找到,请参见6.1.7. Vector Components。简而言之,对于 int4 ,这些组件分别命名为 x , y , z 和 w 。 em>,对于您的 int8 ,您需要使用数字索引: v1.s0 至 v1.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}