OpenCL Reduction操作
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操作相关推荐
- OpenMP中的Reduction操作 #pragma omp xxx reduction()
参考 OpenMP: For & Reduction Reduction Reduction操作类似于我们将很多东西组合组合在一起,比如MapReduce中先Map操作将数据分散,再通过Red ...
- OpenCL 学习step by step (11) 数组求和(reduction)
本篇教程中,我们学习一下如何用opencl有效实现数组求和,也就是通常所说的reduction问题. 在程序中,我们设置workgroup size为256,kernel的输入.输出缓冲参数都用uin ...
- PyTorch深度学习基础之Reduction归约和自动微分操作讲解及实战(附源码 超详细必看)
创作不易 觉得有帮助请点赞关注收藏~~~ 一.PyTorch的Reduction操作 Reduction运算的特点是它往往对一个Tensor内的元素做归约操作,比如torch.max找极大值,torc ...
- AMD OpenCL 大学课程
AMD OpenCL大学课程是非常好的入门级OpenCL教程,通过看教程中的PPT,我们能够很快的了解OpenCL机制以及编程方法.下载地址:http://developer.amd.com/zone ...
- einops 张量操作
pip install einops from einops import rearrange, reduce, repeat # 按给出的模式重组张量 output_tensor = rearran ...
- [转]OpenCL 教学(一)
Contents OpenCL简介 OpenCL的架构 OpenCL环境设定 开始撰写OpenCL程式 建立Command Queue 产生资料 配置记忆体并复制资料 编译OpenCL kernel程 ...
- Tensorflow操作与函数全面解析
转载自:http://blog.csdn.net/lenbow/article/details/52152766 1.tensorflow的基本运作 为了快速的熟悉TensorFlow编程,下面从一段 ...
- 膨胀腐蚀-OpenCL加速及kernel变成二进制文件
讨论后自己写了一个腐蚀膨胀,开操作: 一.最开始的C++版本windows int myopen(Mat bwsrc, Mat &dstimg2, int kernelwidth = 2) { ...
- caffe常用层:Reduction层
Layer type: Reduction 头文件位置:./include/caffe/layers/reduction_layer.hpp CPU 执行源文件位置: ./src/caffe/laye ...
最新文章
- SAP MM IV中的Duplicated Invoice Check功能的测试
- android base layout - top middle bottom
- python 信号量,Event, 定时器
- JS: 关于元素大小和距离的有关的属性总结
- Solr学习总结(二)Solr的安装与配置
- HTML5培训教程学习之动效制作
- CVS代码库管理安装配置
- 设计——主观理想路径
- mysql如果带有换行的处理方式
- 100层楼2个鸡蛋,如何得知鸡蛋能承受几层的撞击
- Python培训 之五 条件判断
- android p preview_细数 Android P 开发者预览版中最不能错过的新特性
- swoole redis
- POJ-2414 Phylogenetic Trees Inherited 状态压缩,位运算处理集合操作
- msdn下载win11的方法,简单易操作
- C语言基础教程之如何定义变量
- 使用bintray-release工具上传gradle项目至bintray.com
- python注册大漠插件,大漠插件安装包
- 亮眼的PPT文字填充特效
- 2022东南大学网安916考研经验贴