NVIDIA CUDA统一计算设备架构编程手册(六)

2009-6-18 作者: icuda 来源: icuda

关键字: NVIDIA CUDA GPU 手册 

  矩阵乘法的示例

  6.1概述

  计算两个维度分别为(wA, hA)和 (wB, wA) 的矩阵A和B的乘积C的任务以下列方式分为多个线程:

  每个线程负责计算C 的一个平方子矩阵Csub ;

  块内的每个线程负责计算Csub的一个元素。

  选择Csub的维度block_size等于16,以便每块的线程数是warp大小的倍数(参见5.2),并且保持低于每块的最大线程数(参见附录A)。

  如图6-1所示,Csub 等于两个矩形矩阵的乘积:维度为(wA, block_size)的子矩阵A,与Csub具有相同的行索引,维度为(block_size, wA)的B的子矩阵,与Csub具有相同的列索引。为了适应设备的资源,这两个矩形矩阵可根据需要划分为许多维度为block_size的平方矩阵,并且Csub计算为这些平方矩阵的乘积之和。其中每个乘积的执行过程是:首先使用一个加载每个矩阵的一个元素的线程,将两个相应的平方矩阵从全局内存加载到共享内存,然后让每个线程计算乘积的一个元素。每一线程将其中每个乘积的结果累计到寄存器中,执行完毕后,将结果写入全局内存。

  通过以这种方式分块计算,我们可以有效利用快速的共享内存,并节省许多全局内存带宽,因为A和B仅从全局内存读取(wA / block_size)次。

  尽管如此,编写此示例是为了清楚地说明各种CUDA编程原则,并非是为了为一般的矩阵乘法提供高性能的内核,所以不应如此构造。

  每一线程块计算C的一个子矩阵Csub。块内的每一线程计算Csub的一个元素。


图1. 矩阵乘法




<<首页 <上一页  1  2  3  下一页>  末页>>  
责任编辑:熊东旭