如何解决OpenCL主机代码:由一个工作项处理的输入矢量的多个元素
我有一个OpenCL程序,其内核将(_global int4 *数组)作为输入。
在主机代码中,我有一个(std :: vector
kernel(_global int4* array){
int i = get_global_id(0);
//I want to use 8 elements that are processed in a work-item here
//note that int8 = (int4,int4)
int8 result = (int8) (array[i],array[i+1]);
}
我是OpenCL的新手,因此深表感谢。
解决方法
工作项是点拓扑吗?
如果您想按二维排列工作项,
您可以使用二维clEnqueueNDRangeKernel函数使内核排队。
然后,工作项将被映射到(0,0)到(n,m),其中n * m对应于工作项的总数。全局ID的第n个元素可通过get_global_id(n-1)获得。
因为kernel的参数是一个指向int4的指针,所以您可能会做一个巧妙的技巧来处理数组,就像二维数组一样。 (例如array[m * get_global_id(0) + get_global_id(1)]
)
毕竟,您可以在每个内核中处理8个相邻的元素。
我找到了clEnqueueNDRangeKernel的规范 https://www.khronos.org/registry/OpenCL/sdk/2.2/docs/man/html/clEnqueueNDRangeKernel.html 以及NDRange的样本和插图 https://japan.xilinx.com/html_docs/xilinx2017_4/sdaccel_doc/auo1504034297598.html。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。