博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CUDA编程模型——组织并行线程2 (1D grid 1D block)
阅读量:4419 次
发布时间:2019-06-07

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

在”组织并行编程1“中,通过组织并行线程为”2D grid 2D block“对矩阵求和,在本文中通过组织为 1D grid 1D block进行矩阵求和。一维网格和一维线程块的结构如下图:

其中,nx是x方向上的最大线程数,ny是一个线程需要处理的数据元素的个数(因为块是一维的,照理应该没有ny)。所以这里这里只有ix是对线程的真正索引,iy是线程内部数据的索引(这个时候要把线程看成一个主线程,里面有ny个子线程组成的,每个子线程依次处理一个数据。但一定要记住,这个子线程实际上并不存在,是并行里面的串行)。这样每个数据的索引 idx 依然满足idx=iy*nx+ix;其中iy是从0迭代到ny的。

相应的核函数如下:(如果核函数和2Dgrid2Dblock一样,会怎样?)

1 __global__ void sumMatrixOnGPU1D(float *MatA,float *MatB,float *MatC,int nx,int ny) 2 { 3     unsigned int ix=threadIdx.x+blockIdx.x*blockDim.x;//获得x方向上的网格坐标 4     if(ix

一维网格和块的线程配置:

1 dim3 block(32,1);2 dim3 grid((block.x-1)/block.x+1,1);

使用以下配置调用核函数:

1 sumMatrixOnGPU1D <<< grid, block >>>(d_MatA, d_MatB, dMatC, nx, ny);

设置矩阵数据量的大小为:

1 // set up data size of matrix2  int nx = 1 << 14;3  int ny = 1 << 14;

运行结果如下所示:(可以到一维网格一维线程块实际分配的线程数是:32*512=16384)

接着按照如下增加线程块的大小:

1 dim3 block(128,1);2 dim3 grid((block.x-1)/block.x+1,1);

运行结果如下:

可以看出核函数运行的更快了。

 

主要参考文献:

  1.  《 CUDA C编程权威指南 》 
  2.    https://blog.csdn.net/weixin_40427089/article/details/86696707

转载于:https://www.cnblogs.com/IMWH/p/10633284.html

你可能感兴趣的文章
XP 安装ORACLE
查看>>
八、 vSphere 6.7 U1(八):分布式交换机配置(vMotion迁移网段)
查看>>
我的友情链接
查看>>
JS中比较数字大小
查看>>
jQuery插件的开发
查看>>
基础,基础,还是基础之JAVA基础
查看>>
JS prototype 属性
查看>>
HTTP库Axios
查看>>
gen already exists but is not a source folder. Convert to a source folder or rename it 的解决办法...
查看>>
20个Linux服务器性能调优技巧
查看>>
填坑记:Uncaught RangeError: Maximum call stack size exceeded
查看>>
SpringCloud之消息总线(Spring Cloud Bus)(八)
查看>>
【348天】每日项目总结系列086(2018.01.19)
查看>>
【294天】我爱刷题系列053(2017.11.26)
查看>>
2016/08/25 The Secret Assumption of Agile
查看>>
(Portal 开发读书笔记)Portlet间交互-PortletSession
查看>>
搭建vsftpd服务器,使用匿名账户登入
查看>>
JAVA中循环删除list中元素的方法总结
查看>>
Java虚拟机管理的内存运行时数据区域解释
查看>>
人人都会深度学习之Tensorflow基础快速入门
查看>>