c++ - 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*/
}
}
解决方案
关于这方面的详细信息可以在规范中找到,见6.1.7。矢量组件。简而言之,对于int4 ,组件被命名为x、y、z和w,对于您的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}
推荐阅读
- python - 需要 unicode 参数,得到 'str'
- twilio - 在 twilio hold 上播放直播
- amazon-web-services - DynamoDB 流可以看到未提交的事务吗?
- ms-access - 添加记录按钮以将行附加到表中并刷新表单以获取新记录条目 MS ACCESS
- r - 使用 ggplot 根据 x 值应用透明背景来划分绘图区域
- ssh - 10 分钟后使用 ssh 超时执行远程脚本
- sonarqube - SonarQube/SonarCloud - SonarQube Web 界面 (UI) 中是否有一个选项可以显示每个提交的分析?
- r - 如何根据 1 行中 1 列中的值将 ID 分配给多行,复制 R 中不同行中不同列中的值?
- javascript - AngularJs Ui-Router 向现有 app.config 添加新状态
- arrays - 多个条件唯一值