Opencl 并行求和
上周尝试用opencl求极大值,在网上查到大多是求和,所谓的reduction算法。不过思路是一样的。
CPP:
int err = ;
unsigned long int nNumCount = ;
int nLocalSize = ;
int nGroupSize = ;
int nGroup = nGroupSize / nLocalSize; int* pArray = new int[nNumCount];
unsigned long int nReal = ;
int nStart = GetTickCount();
for (int i=;i<nNumCount;++i)
{
pArray[i] = i*;
nReal += pArray[i];
}
cout<<GetTickCount() - nStart<<endl; cl_mem clmemArray = clCreateBuffer(context,CL_MEM_READ_WRITE,sizeof(int) * nNumCount,NULL,NULL);
err = clEnqueueWriteBuffer(queue,clmemArray,CL_TRUE,,sizeof(int)*nNumCount,pArray,,,);
cl_mem clmemRes = clCreateBuffer(context,CL_MEM_READ_WRITE,sizeof(int) * nGroup,NULL,NULL); nStart = GetTickCount(); err = clSetKernelArg(m_KerCalcRay,,sizeof(cl_mem),&clmemArray);
err = clSetKernelArg(m_KerCalcRay,,sizeof(cl_mem),&clmemRes);
err = clSetKernelArg(m_KerCalcRay,,sizeof(int)*nLocalSize,);
err = clSetKernelArg(m_KerCalcRay,,sizeof(int),&nNumCount); size_t localws[] = {nLocalSize};
size_t globalws[] = {nGroupSize}; err = clEnqueueNDRangeKernel(queue,m_KerCalcRay,,NULL,globalws,localws,,NULL,NULL);
clFinish(queue); int* pRes = new int[nGroup];
err = clEnqueueReadBuffer(queue,clmemRes,CL_TRUE,,sizeof(int)*nGroup,pRes,,,);
clFinish(queue); unsigned long int nRes = ;
for(int i=;i<nGroup;++i)
{
nRes += pRes[i];
}
assert(nRes == nReal);
kernel:
__kernel void ReduceSum(__global int* num,__global int* res,__local int* pData,int nCount)
{
unsigned int tid = get_local_id();
unsigned int bid = get_group_id();
unsigned int gid = get_global_id();
unsigned int localSize = get_local_size();
unsigned int globalSize = get_global_size(); int nRes = ;
while(gid < nCount)
{
nRes += num[gid];
gid += globalSize;
}
pData[tid] = nRes;
barrier(CLK_LOCAL_MEM_FENCE); // do reduction in shared mem
for(unsigned int s = localSize >> ; s > ; s >>= )
{
if(tid < s)
{
pData[tid] += pData[tid + s];
}
barrier(CLK_LOCAL_MEM_FENCE);
} if(tid == )
res[bid] = pData[]; }
Reduction求和是这样一种方法,比如8个数0到7依次存放,求和的时候就是下标0和4、1和5、2和6、3和7,求和结果放到下标0、1、2、3中(同步一把barrier(CLK_LOCAL_MEM_FENCE))。然后继续就是0和2,、1和3求和结果放到0、1中。如此往复、最终结果就放到下标0中啦。
另:我试过循环展开减少同步次数、不过效率增长微乎其微。
Opencl 并行求和的更多相关文章
- 【MPI】并行求和
比较简单的并行求和 读入还是串行的 而且无法处理线程数无法整除数据总长度的情况 主要用到了MPI_Bcast MPI_Scatter MPI_Reduce typedef long long __in ...
- Python的并行求和例子
先上一个例子,这段代码是为了评估一个预测模型写的,详细评价说明在 https://www.kaggle.com/c/how-much-did-it-rain/details/evaluation, 它 ...
- OpenMP共享内存并行编程详解
实验平台:win7, VS2010 1. 介绍 平行计算机可以简单分为共享内存和分布式内存,共享内存就是多个核心共享一个内存,目前的PC就是这类(不管是只有一个多核CPU还是可以插多个CPU,它们都有 ...
- 《OpenCL异构计算》新版中译本派送中!
<OpenCL异构计算1.2>新鲜出炉,目前市面上仍一书难求!我们已向清华出版社订购到第一批新书.关注异构开发社区,积极参与,就有可能免费获取新书! 1.如果您异构社区的老朋友,请关注:1 ...
- OpenCL Workshop 1 —— 数字音频滤波
Introduction 这两年深度学习大火,Cuda跟着吃红利,OpenCL发展也很快.虽然OpenCL不是事实上的标准,但是作为开放标准,适应性是很强的,除了显卡之外,CPU/FPGA上都可以执行 ...
- Java8的新特性--并行流与串行流
目录 写在前面 Fork/Join框架 Fork/Join框架与传统线程池的区别 传统的线程池 Fork/Join框架 Fork/Join框架的使用 Java8中的并行流 写在前面 我们都知道,在开发 ...
- 给深度学习入门者的Python快速教程 - 番外篇之Python-OpenCV
这次博客园的排版彻底残了..高清版请移步: https://zhuanlan.zhihu.com/p/24425116 本篇是前面两篇教程: 给深度学习入门者的Python快速教程 - 基础篇 给深度 ...
- Hadoop与Spark比较
先看这篇文章:http://www.huochai.mobi/p/d/3967708/?share_tid=86bc0ba46c64&fmid=0 直接比较Hadoop和Spark有难度,因为 ...
- 【java并发系列】Fork/Join任务(转)
原文链接 当我们需要执行大量的小任务时,有经验的Java开发人员都会采用线程池来高效执行这些小任务.然而,有一种任务,例如,对超过1000万个元素的数组进行排序,这种任务本身可以并发执行,但如何拆解成 ...
随机推荐
- CSS详解
Web前端开发css基础样式总结 颜色和单位的使用 颜色 用颜色的名字表示颜色,比如:red 用16进制表示演示 比如:#FF0000 用rgb数值表示颜色,rgb(红,绿,蓝),每个值都在0-255 ...
- [MySQL] 高可用架构MMM简单介绍
一.来源及原理: 众所周知,MySQL自身提供了AB复制(主从复制),然后可以很轻松实现master-master双向复制,同时再为其中一个Master节点搭建一个Slave库. 这样就实现了MySQ ...
- 多个Jdk版本(转)
window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法 本机已经安装了jdk1.7,而比较早期的项目需要依赖jdk1.6,于是同时在本机安装了jdk1.6和jdk1.7. 安装 ...
- 【转】Hibernate级联注解CascadeType参数详解
cascade(级联) 级联在编写触发器时经常用到,触发器的作用是当 主控表信息改变时,用来保证其关联表中数据同步更新.若对触发器来修改或删除关联表相记录,必须要删除对应的关联表信息,否则,会存有脏数 ...
- [python实现设计模式]-3.简单工厂模式-触宝开放平台
预备知识: 开放封闭原则(Open-Closed Principle OCP) Software entities(classes,modules,functions etc) should open ...
- matlab的滤波器仿真——低通滤波器与插值滤波器
项目里面有用到插值滤波器的场合,用matlab做了前期的滤波器性能仿真,产生的滤波器系数保存下来输入到FPGA IP中使用即可. 下面是仿真的代码 % clear all close all Nx = ...
- 常用的.Net 知识点
1.Replace C#:(using System.Text.RegularExpressions;) string txt = Regex.Replace(txtLog.Text.ToString ...
- OCR图像识别技术-Asprise OCR
// csc AspriseDemo.cs /r:AspriseOcr.dll // 注意注册:AspriseOCR.InputLicense("123456", "12 ...
- JS 学习(三)DOM
HTML DOM(文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model).HTML DOM 模型被构造为对象的树. HTML DOM树: Java ...
- mongoDB数据库
1.mongoDB简介:mongoDB 为非关系数据库,集合(collection)关系数据库中的表,中存储的为json结构的文档,集合中的每一条记录都可以结构不同, 但必须都有_id字段(mongo ...