当前位置:   article > 正文

GPU并行——循环展开_for循环怎么放到gpu并行

for循环怎么放到gpu并行

    利用GPU进行多线程并行计算,将for循环程序块中单次循环的计算工作分配到GPU的单个线程中去,由此多层嵌套循环可被展开。下面举例介绍如何快速将线程标号对应到相应循环标号上。

    现有如下的嵌套循环:

    要对整个循环进行展开需要用到nelx  * nely* nelz个线程,为了适应硬件对线程束大小的规定,线程块设为32*32大小,具体线程分配如下:

  1. #define BLOCK_WIDTH 1024
  2. //分配线程
  3. int bkX1 = nelx * nely* nelz /BLOCK_WIDTH; // X方向
  4. if (nelx * nely * nelz % BLOCK_WIDTH) bkX1++;
  5. dim3 grid(bkX1); // 默认y,z维度为1
  6. dim3 block(32,32);// 默认z维度为1

    接下来实现线程标号对应至循环标号

    根据第一幅图中的e1变量的赋值语句可知,e1变量为循环次数的总标号,将线程标号idx和e1对应起来理解,根据e1总标号反推出i1、j1、k1循环标号,也就是将线程标号对应到循环标号,此问题较容易:

  1. //线程标号
  2. int idx = threadIdx.x * blockDim.y + threadIdx.y + blockDim.x * blockDim.y * blockIdx.x;
  3. //余数
  4. int remainder;
  5. //最外层循环k1
  6. int k1=idx/ (nelx * nely);
  7. //取余
  8. remainder =idx% (nelx * nely);
  9. //内层循环j1
  10. int j1 = remainder / nelx;
  11. remainder = remainder % (nelx);
  12. //内层循环i1
  13. int i1 = remainder;

    将idx理解为式(k1)*nelx*nely+(j1)*nelx+i1,由于nelx、nely、nelz给定,idx首先对最外层循环进行除整以及求余操作,再由remainder对内层循环进行相同操作即可依次获得k1、j1、i1,由此,一个三层循环被展开。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/261507
推荐阅读