AMD OpenCL例子阅读笔记系列之Radix_Sort(六)
来源:互联网 发布:网络咨询医生工资待遇 编辑:程序博客网 时间:2024/04/28 20:01
终于到最后出结果的时刻了,有点小激动呢哼。通过5的分析,实际上再看最后一个内核函数就会很轻松了。最后一个内核函数是permute函数,以64*256个元素为组进行处理。每个work-item处理256个数据。在单倍情况下就只有64*256个数据处理,这时候全局和局部都是64,一维情况。
看了下,似乎没有什么难以理解的地方,主要用到了局部内存和内核同步等知识。直接上内核函数。
__kernelvoid permute(__global const uint* unsortedData, __global const uint* scanedBuckets, uint shiftCount, __local ushort* sharedBuckets, __global uint* sortedData){ size_t groupId = get_group_id(0); size_t localId = get_local_id(0); size_t globalId = get_global_id(0); size_t groupSize = get_local_size(0); /* Copy prescaned thread histograms to corresponding thread shared block */ for(int i = 0; i < RADICES; ++i) { uint bucketPos = groupId * RADICES * groupSize + localId * RADICES + i; sharedBuckets[localId * RADICES + i] = scanedBuckets[bucketPos]; } barrier(CLK_LOCAL_MEM_FENCE); /* Premute elements to appropriate location */ for(int i = 0; i < RADICES; ++i) { uint value = unsortedData[globalId * RADICES + i]; value = (value >> shiftCount) & 0xFFU; uint index = sharedBuckets[localId * RADICES + value]; sortedData[index] = unsortedData[globalId * RADICES + i]; sharedBuckets[localId * RADICES + value] = index + 1; barrier(CLK_LOCAL_MEM_FENCE); }}前一个循环把所有的桶内容移到局部内存,第二个循环把数据放到合适的位置,每个work-item处理RADICES=256个数据,因每组是64个work-item所以每组就处理256*64个数据,就是我们前面说的单倍数据量了。有人说那还有两个附加的内核没讲吧?对是的。但是我感觉有些东西留着自己研究会好些。都讲了反而不美。留几个问题思考下:
1.在内核函数中多次使用了局部内存,这样做有什么好处?
2.多内核函数的调用问题,这个例子里面也算是典型了,每个内核或者几个内核组合得到中间结果,然后交由后续内核继续进行求解。
3.留的两个内核函数,及多倍情况下的数据处理。
4.这显然只是一个例子,如果需要实际应用,也就是说拿来用,怎么用?
5.在RadixSort中两次用到了缩减树的算法,这个算法能不能进行优化一下?怎么优化?
好了,就这些吧,RadixSort就到这里啦。
0 0
- AMD OpenCL例子阅读笔记系列之Radix_Sort(六)
- AMD OpenCL例子阅读笔记系列之Radix_Sort(一)
- AMD OpenCL例子阅读笔记系列之Radix_Sort(二)
- AMD OpenCL例子阅读笔记系列之Radix_Sort(三)
- AMD OpenCL例子阅读笔记系列之Radix_Sort(四)
- AMD OpenCL例子阅读笔记系列之Radix_Sort(五)
- AMD OpenCL例子阅读笔记系列之AtomicCounters
- AMD OpenCL例子阅读笔记系列之BinarySearch
- AMD OpenCL例子阅读笔记系列之DeviceFission
- Solr入门之官方文档6.0阅读笔记系列(六) 第三部分开始
- PTAMM阅读笔记之阶段性总结(六)
- 六级之阅读理解笔记2
- soft raid5阅读笔记之六--修复
- radix_sort
- OpenCL 1.0 Specification阅读笔记(1)
- OpenCL 1.0 Specification阅读笔记(2)
- OpenCL 1.0 Specification阅读笔记(3)
- OpenCL 1.0 Specification阅读笔记(4)
- 关于xmlns:tools使用
- Android 服务类Service 的详细学习
- JavaScript Math(算数)对象
- 网盘加密策略
- iterator const_iterator
- AMD OpenCL例子阅读笔记系列之Radix_Sort(六)
- 《HTTP权威指南》读书笔记——HTTP报文
- Android4.4平台下配置分项目的说明
- [转载]VS2012简单的使用感受+插件推荐
- RTSP协议介绍
- JNDI详解
- ubuntu12.04.04LTS server 版本U盘安装
- Linux系统在X86上的虚拟内存管理(May 20)
- jquery技巧总结-jQuery对象,集合,方法扩展,事件处理,特效,解决冲突