博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CUDA中的归约
阅读量:6567 次
发布时间:2019-06-24

本文共 685 字,大约阅读时间需要 2 分钟。

CUDA编程实战书中的乘方和解决办法:

对一个数组执行某种计算,然后产生一个更小的结果数组。

由一个线程在共享内存上进行迭代并计算出总和值。而如果用并行,所花时间就与数组长度的对数成正比。

代码的思想是,每个线程将cache[]中的两个值加和,然后结果保存回cache[]。由于每个线程都将两个值合并为一个值,那么在完成这个步骤后,得到的结果数量就是计算开始时数值数量的一半。在下一个步骤中,我们对这一半数值执行相同的操作。在将这种操作执行log2(threadsPerBlock)个步骤后,就能得到cache[]中所有值的总和。对这里的示例来说,我们在每个线程块中使用了256个线程,因此需要8次迭代将cache[]中的256个值归约为一个值。

int i = blockDim.x/2;

while(i != 0)

{

  if(cacheIndex < i)

    cache[cacheIndex]+=cache[cacheIndex + i];

     __syncthreads();

     i /= 2;

}

取threadsPerBlock的一半作为i值,只有索引小于这个值的线程才会执行。只有当线程的索引小于i时,才可以把cache[]的两个数据项相加起来,因此我们将假发运算放在if(cacheIndex<i)的代码块中。执行加法运算的线程将cache[]中线程索引位置上的值和线程索引加上i得到的位置上的值相加,并将结果保存会cache[]中线程索引位置上。

转载于:https://www.cnblogs.com/ubiwind/p/5084911.html

你可能感兴趣的文章
Knockout.Js官网学习(监控属性Observables)
查看>>
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务解决
查看>>
azure之MSSQL服务性能测试
查看>>
Android BitmapFactory.Options
查看>>
前端构建:Less入了个门
查看>>
phonegap(cordova) 自己定义插件代码篇(三)----支付宝支付工具整合
查看>>
linux 批量进行:解压缩某一类压缩文件类型的文件
查看>>
激活modelsim se 10.4 时运行patch_dll.bat不能生成TXT
查看>>
Node.js中针对中文的查找和替换无效的解决方法
查看>>
如何查看Ubuntu下已安装包版本号
查看>>
VS2017 配置ImageMagick
查看>>
【Leetcode】Search in Rotated Sorted Array
查看>>
tomcat架构分析(valve源码导读)
查看>>
spring中InitializingBean接口使用理解(转)
查看>>
基于php5.5使用PHPMailer-5.2发送邮件
查看>>
InstallShield 2012 Spring新功能试用(16): Suite/Advanced UI 或 Advanced UI安装程序能在安装时进行输入合法性校验与反馈...
查看>>
C#面试宝典
查看>>
基金项目的英文
查看>>
《软件性能测试与LoadRunner实战教程》喜马拉雅有声图书上线
查看>>
ios 字典转模型
查看>>