【发布时间】: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*),然后可以使用括号。