Reduction操作:说白了就是把一个或多个数组输入,最后输出一个结果。

参考这个博客:

https://www.cnblogs.com/xudong-bupt/p/3586518.html

我这边实现了一下求一个数组里的最大值:

host端:

#include "openclcommon/oclManager.h"
#include<stdlib.h>
#include <iostream>#define ArraySize 512
int main()
{// Init OpenCLCOCLManager *oclManager = COCLManager::GetInstance();if (!oclManager->InitCL()){return 0;}// load CL filesbool clLoadSuccess = false;cl::Kernel testKernel;if (oclManager->HasGPU()){testKernel = oclManager->BuildFromSource("CLfiles/reductionMax.cl", "reductionMaxUInt", clLoadSuccess);std::cout << " clLoadSuccess :" << clLoadSuccess << std::endl;}//执行 并行计算if (clLoadSuccess){int* vec1 = new int[ArraySize];int* vecResult = new int[2];vecResult[0] = 0;vecResult[1] = 0;std::cout << *vecResult << std::endl;for (int i = 0; i < ArraySize; i++){vec1[i] = i;}//初始化//第一步分配内存,cl::Buffer v1 = cl::Buffer(oclManager->getContex(), CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, sizeof(int) * ArraySize, vec1);cl::Buffer v2 = cl::Buffer(oclManager->getContex(), CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, sizeof(int) * 2, vecResult);cl::Event testevet;//对应三个参数值第二部设置参数testKernel.setArg(0, v1);testKernel.setArg(1, v2);testKernel.setArg(2, ArraySize);//第三步执行oclManager->getQueue().enqueueNDRangeKernel(testKernel,cl::NullRange,cl::NDRange(ArraySize), // 数据维度参数cl::NDRange(256),NULL,&testevet);cl_ulong nsec = oclManager->getElapsedTime(testevet,oclManager->getQueue());std::cout << "运算时间(ms):" << nsec*1e-6 << std::endl;//把计算结果读出来oclManager->getQueue().enqueueReadBuffer(v2,CL_TRUE,0,sizeof(int)*2,vecResult);std::cout << vecResult[0] << vecResult[1] << std::endl;delete[] vec1;delete[] vecResult;//释放显存,C++版本会自动释放}system("PAUSE");return 0;
}

cl文件

__kernel void reductionMaxUInt(__global uint* inputData,__global uint* outputMax,__private uint arraySize)
{uint threadId = get_local_id(0);uint localSize = get_local_size(0);uint globleSize = get_global_size(0);uint tempMax = 0;__local uint localArray[256];//每个block设置256个threaduint globleId = get_global_id(0); while(globleId < arraySize) //这个循环讲道理就执行一遍{tempMax = inputData[globleId];globleId +=  globleSize;}localArray[threadId] = tempMax;barrier(CLK_LOCAL_MEM_FENCE);//确保所有的local数组的元素都被赋值了//do reductionfor(unsigned int i = localSize >> 1; i > 0; i >>= 1) //按位递减,每次循环比较一半的元素{barrier(CLK_LOCAL_MEM_FENCE);if(threadId < i) {localArray[threadId] = max(localArray[threadId], localArray[threadId + i]);//比较取最大值}}//把结果写入output//做这个判断就是为了只需要执行一次的操作,这里也就是说每个group(256个大小的)都分别求出一个最大值if(threadId == 0){outputMax[get_group_id(0)] = localArray[0];}}

我这边把输入数组数据长度设置为512,local size 设置为256,那么分为两组group分别进行比较,最后输出两个结果,vecResult[0] == 255;  vecResult[1] == 511;

OpenCL Reduction操作相关推荐

  1. OpenMP中的Reduction操作 #pragma omp xxx reduction()

    参考 OpenMP: For & Reduction Reduction Reduction操作类似于我们将很多东西组合组合在一起,比如MapReduce中先Map操作将数据分散,再通过Red ...

  2. OpenCL 学习step by step (11) 数组求和(reduction)

    本篇教程中,我们学习一下如何用opencl有效实现数组求和,也就是通常所说的reduction问题. 在程序中,我们设置workgroup size为256,kernel的输入.输出缓冲参数都用uin ...

  3. PyTorch深度学习基础之Reduction归约和自动微分操作讲解及实战(附源码 超详细必看)

    创作不易 觉得有帮助请点赞关注收藏~~~ 一.PyTorch的Reduction操作 Reduction运算的特点是它往往对一个Tensor内的元素做归约操作,比如torch.max找极大值,torc ...

  4. AMD OpenCL 大学课程

    AMD OpenCL大学课程是非常好的入门级OpenCL教程,通过看教程中的PPT,我们能够很快的了解OpenCL机制以及编程方法.下载地址:http://developer.amd.com/zone ...

  5. einops 张量操作

    pip install einops from einops import rearrange, reduce, repeat # 按给出的模式重组张量 output_tensor = rearran ...

  6. [转]OpenCL 教学(一)

    Contents OpenCL简介 OpenCL的架构 OpenCL环境设定 开始撰写OpenCL程式 建立Command Queue 产生资料 配置记忆体并复制资料 编译OpenCL kernel程 ...

  7. Tensorflow操作与函数全面解析

    转载自:http://blog.csdn.net/lenbow/article/details/52152766 1.tensorflow的基本运作 为了快速的熟悉TensorFlow编程,下面从一段 ...

  8. 膨胀腐蚀-OpenCL加速及kernel变成二进制文件

    讨论后自己写了一个腐蚀膨胀,开操作: 一.最开始的C++版本windows int myopen(Mat bwsrc, Mat &dstimg2, int kernelwidth = 2) { ...

  9. caffe常用层:Reduction层

    Layer type: Reduction 头文件位置:./include/caffe/layers/reduction_layer.hpp CPU 执行源文件位置: ./src/caffe/laye ...

最新文章

  1. SAP MM IV中的Duplicated Invoice Check功能的测试
  2. android base layout - top middle bottom
  3. python 信号量,Event, 定时器
  4. JS: 关于元素大小和距离的有关的属性总结
  5. Solr学习总结(二)Solr的安装与配置
  6. HTML5培训教程学习之动效制作
  7. CVS代码库管理安装配置
  8. 设计——主观理想路径
  9. mysql如果带有换行的处理方式
  10. 100层楼2个鸡蛋,如何得知鸡蛋能承受几层的撞击
  11. Python培训 之五 条件判断
  12. android p preview_细数 Android P 开发者预览版中最不能错过的新特性
  13. swoole redis
  14. POJ-2414 Phylogenetic Trees Inherited 状态压缩,位运算处理集合操作
  15. msdn下载win11的方法,简单易操作
  16. C语言基础教程之如何定义变量
  17. 使用bintray-release工具上传gradle项目至bintray.com
  18. python注册大漠插件,大漠插件安装包
  19. 亮眼的PPT文字填充特效
  20. 2022东南大学网安916考研经验贴

热门文章

  1. yum及yum-config-manager命令详解
  2. HackTheBox | Horizontall
  3. ICA原理推导及代码实现
  4. 【高效开发工具系列】API工具
  5. [玩转编程] C语言+模拟器制作简单脚本
  6. python爬虫今日头条_python 简单爬取今日头条热点新闻(
  7. 【JavaSE与数据结构】栈与Stack类
  8. JAVA构造器、静态上下文的执行时机与代码执行顺序详解
  9. Kubernetes一致性认证
  10. 如何快速检索PDF文档中的关键词?