zoukankan      html  css  js  c++  java
  • CUDA中的归约

    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[]中线程索引位置上。

  • 相关阅读:
    顶点与片段着色器的例子
    Unity cg vertex and fragment shaders(二)
    Unity cg vertex and fragment shaders(一)
    C#线程(一)
    shell脚本变量定义注意别跟系统变量重名了……
    VLC编译问题
    VIM技巧:翻页
    Linux命令:cd
    Linux设置:环境变量
    VIM技巧:显示行号
  • 原文地址:https://www.cnblogs.com/ubiwind/p/5084911.html
Copyright © 2011-2022 走看看