矩阵乘法的一个例子不太理解,求教于大神

Sergio_ly 2019-02-27 10:03:55
本例摘自英伟达官方文档cuda c best practice guide

__global__ void coalescedMultiply(float *a, float* b, float *c,
int N)
{
__shared__ float aTile[TILE_DIM][TILE_DIM];
int row = blockIdx.y * blockDim.y + threadIdx.y;
int col = blockIdx.x * blockDim.x + threadIdx.x;
float sum = 0.0f;
aTile[threadIdx.y][threadIdx.x] = a[row*TILE_DIM+threadIdx.x];
for (int i = 0; i < TILE_DIM; i++) {
sum += aTile[threadIdx.y][i]* b[i*N+col];
}
c[row*N+col] = sum;
}


这个例子是矩阵C = A × B,利用共享内存解决全局内存跨步访问的问题。下面的解释中有这样一条不理解:
Within each iteration of the for loop, a value in shared memory is broadcast to all threads in a warp
请问这里为什么会是广播访问?
...全文
2077 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
瓶邪.slj 2019-03-02
  • 打赏
  • 举报
回复
如上输出结果是:array( [ [6.] , [6.] ] )
瓶邪.slj 2019-03-02
  • 打赏
  • 举报
回复
def Matrix_Mul(a,b):
if a.shape[1] != b.shape[0]:
print('这两个矩阵无法做乘法,请检查左边矩阵的列数是否与右边矩阵的行数相等!')
else:
c = np.zeros(a.shape[0]*b.shape[1]).reshape(a.shape[0],b.shape[1])
for i in range(a.shape[0]):
for j in range(b.shape[1]):
for k in range(a.shape[1]):
c[i,j] = c[i,j] + a[i,k]*b[k,j]
return c

import numpy as np
a = np.matrix([[2,3,4],[1,0,5]])
b = np.matrix([1,0,1]).T
Matrix_Mul(a=a,b=b)
wjsjason 2019-02-28
  • 打赏
  • 举报
回复
我没有细看代码,不过听你的描述,这段英文可以这样理解:矩阵乘法中,矩阵A的一行,需要与矩阵B的每一列相乘,如果一个线程负责A的一行与B的一列相乘,则32个线程就可以负责A的一行与B的32列相乘,此时32个线程是同时访问A的一行的,所以32次访问可以通过广播只访问1次。这里用了共享内存,以上描述“A的一行‘’可以看成是“aTile里的一行”

579

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧