找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 154|回复: 1

为什么不同尺寸的矩阵相乘性能不相同(总计算量一样)?

[复制链接]
发表于 2018-8-25 01:29:19 | 显示全部楼层 |阅读模式
GTC
请问我使用一个矩阵A(200*50)乘以矩阵B(30000*50)结果矩阵大小为(200*30000)的性能 与 使用矩阵B(30000*50)乘以 矩阵A(200*50) 结果矩阵大小为(30000*200)非常不同。
A×B的速度(1.62ms)要比B×A的速度(6.05ms)快4倍左右。
矩阵A与矩阵B的存储方式是相同的,并且在计算时使用了shared memory。我使用的显卡是Titan Xp。
我矩阵计算的函数如下所示,其中aLen代表A矩阵的行数,bLen代表B矩阵的行数。A、B矩阵列数相同都是50.
  1. __global__
  2. void SMatMulKernel(const float* a, const int aLen, const float* b, const int bLen, float* c){
  3.         int blockRow = blockIdx.x;
  4.         int blockCol = blockIdx.y;
  5.         int tx = threadIdx.x;
  6.         int ty = threadIdx.y;
  7.         int cx = blockRow*BLOCK_SIZE + tx;
  8.         int cy = blockCol*BLOCK_SIZE + ty;
  9.         float cValue = 0;
  10.         int subNum = (COL_NUM+BLOCK_SIZE-1)/BLOCK_SIZE;
  11.         for (int m=0; m<subNum; ++m){
  12.                 int ax = blockRow * BLOCK_SIZE + tx;
  13.                 int ay = m * BLOCK_SIZE + ty;
  14.                
  15.                 int bx = blockCol * BLOCK_SIZE + tx;
  16.                 int by = m * BLOCK_SIZE + ty;
  17.                 __shared__ float As[BLOCK_SIZE][BLOCK_SIZE];
  18.                 __shared__ float Bs[BLOCK_SIZE][BLOCK_SIZE];
  19.                 As[tx][ty] = getEle(a, ax, ay, aLen);
  20.                 Bs[tx][ty] = getEle(b, bx, by, bLen);
  21.                 __syncthreads();
  22.                 for (int j=0; j<BLOCK_SIZE; ++j){
  23.                         cValue += As[tx][j] * Bs[ty][j];
  24.                 }
  25.                 __syncthreads();
  26.         }
  27.         if (cx<aLen && cy<bLen){
  28.                 c[cx*bLen+cy] = cValue;
  29.         }
  30. }
复制代码

我猜想造成这种现象的原因是因为Thread BLocks调度的问题。但希望专家能给出更充分解释,谢谢。
回复

使用道具 举报

发表于 2018-8-25 20:49:18 | 显示全部楼层
Jetson TX2
关于矩阵乘法这个问题, 建议立即使用cublas。自行重新发明轮子只会是时间的浪费, 而且你往往还无法得到cublas的速度。

cublas到现在已经多次提速了,基本上超越了大部分人(包括我)的写作能力。除非特殊情况(例如特殊的数据类型),应当总是使用它。

周末快乐!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

快速回复 返回顶部 返回列表