CUDA实例系列二:矩阵转置优化

矩阵转置优化

矩阵转置是CUDA初学者们刚开始面临的一个比较绕的问题, 他的"绕"在于其中坐标的转换, 以及使用Shared Memory来解决合并访存的过程.

在很多实际项目或应用中, 矩阵转置多数都是其中一个步骤.接下来我就来解释下如何利用CUDA优化矩阵转置问题.

首先, 解释下矩阵转置矩阵转置

按照矩阵转置的公式,我们设定(按照下图所示)

输入矩阵为: A[16][16] M=16
输出矩阵为: B[16][16]
保证:A[y][x] = B[x][y]

接下来, 话不多说直接上代码(不要划走, 解释在代码之后):

__global__ void transpose(int A[M][M], int B[M][M])
{
    __shared__ int rafa[TILE_SIZE][TILE_SIZE + 1]; //tell me why?
	
    int x = threadIdx.x + blockDim.x * blockIdx.x;
    int y = threadIdx.y + blockDim.y * blockIdx.y;
    if (x < M && y < M)
    {
	rafa[threadIdx.y][threadIdx.x] = A[y][x];
    }
    __syncthreads();
	
    int y2 = threadIdx.y + blockDim.x * blockIdx.x;
    int x2 = threadIdx.x + blockDim.y * blockIdx.y;
    if (x2 < M && y2 < M)
    {
	B[y2][x2] = rafa[threadIdx.x][threadIdx.y];
    }
}
  1. 先说明一下实验环境

在这里插入图片描述


  1. 将数据从global Memory中读取到shared memory, 注意这里申请shared memory的时候TILE_SIZE+1是为了避免Shared memory的冲突

在这里插入图片描述


  1. 将对应的结果写入global memory, 具体说明写在图片中

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


这样我们就完成了矩阵的转置, 最麻烦的部分是坐标问题, 大家一定要看仔细

  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扫地的小何尚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值