PTX mma 指令(如何在线程中的寄存器存放矩阵数据的理解)

2 篇文章 0 订阅
1 篇文章 0 订阅
本文详细解释了PTX库中mma指令在处理1bit矩阵乘法(m16n8k128)时,如何利用线程和寄存器进行数据分配。矩阵A和B的存储方式,以及矩阵C的结果生成过程都被清晰地阐述。
摘要由CSDN通过智能技术生成

PTX 的mma指令用于计算不同数据类型的矩阵乘法,目前在CUTLASS库中wmma和mma都有使用。

在此记录下mma指令在计算1bit矩阵乘法时,怎么理解其中的线程中的寄存器对于矩阵数据的存放。

这里以1bit m16n8k128为例。

原PTX文档链接如下:

 matrix-fragments-for-mma-m16n8k128

一、mma.m16n8k128

原文档这句话是说,这里将会用一个warp(通常是32个线程)执行1bit矩阵大小为m16n8k128的矩阵乘法。m16n8k128的意思是,矩阵A尺寸是16*128(row-major),矩阵B尺寸是128*8(col-major),结果矩阵C尺寸是16*8(row-major)(结果矩阵一般是float数据类型)。注意,这里仍旧是1bit为一个数据。

然后1bit矩阵的所有数据都会被32个线程瓜分。具体怎么瓜分呢?

二、1bit矩阵的线程具体分配过程理解

2.1 矩阵A

图1

PTX文档中对于1bit矩阵数据的瓜分过程写的很清楚了,但是一开始很难理解到底是什么意思。

这里记录一下自己对于它们的理解。

例如,针对矩阵A尺寸为16*128,它一共有16*128个1bit数据,因此需要占用这么大的内存空间。

如图1所示,这里分配了编号为T0到T31的一共32个线程用于装载矩阵A数据,每个线程分配2个.b32寄存器。计算一下,一共是32x2x32=2048bit,刚好矩阵A大小也是16*128=2048bit,刚好装下。

根据图1所示,32个线程进行了一个8行4列的排布,并且每个线程中都有两个.b32大小的寄存器。第0到第7行的数据都被均分到32个线程的第一个寄存器中。第8到第15行的数据都被均分到32个线程的第二个寄存器中。为了方便理解,画一个简图2:

图2 线程和寄存器位置简图

根据图2应该可以把线程中寄存器的位置分配和矩阵A在线程的寄存器中的分布位置联系起来。

2.2矩阵B

图3

矩阵B尺寸是128*8bit。32个线程T0到T31按照4行8列排布,由于矩阵B本身是列排列(col-major),所以线程的顺序也是列排布的顺序,第一列下来是T0,T1,T2,T3。每个线程分配1个.b32寄存器。所以是每32个相邻的bit数据放进一个.b32寄存器中。计算一下,也是刚好放进去。

2.2矩阵C

图4

矩阵C大小是16*8,数据类型是.s32。线程T0到T31按照8行4列排布,每个线程里面装4个.s32寄存器,也就是说可以装4个矩阵C数据。

矩阵C的前8行数据,每两个数据为一组,顺序装进每个线程的前两个寄存器中。

矩阵C的后8行数据,每两个数据为一组,顺序装进每个线程的后两个寄存器中。

32个线程和寄存器的位置排布如图5所示。

图5

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是MATLAB仿真OOK信号在光纤传输,并显示眼图的代码: ```matlab % 设置参数 N = 1000; % 信号长度 T = 1e-9; % 采样时间 Ts = 2*T; % 符号时间 fc = 10e6; % 光载波频率 Rs = 1/Ts; % 符号速率 Rb = 2*Rs; % 比特速率 L = 100; % 光纤长度 D = 17; % 群速延迟 alpha = 0.2; % 损耗系数 Ptx = 0.1; % 发射功率 q = 1.60217662e-19; % 电子电荷量 R = 1; % 接收器响应 % 生成随机比特流 data = randi([0 1], 1, N); % 显示发送数据 subplot(2, 1, 1); stem(data); title('发送数据'); xlabel('比特序号'); ylabel('比特值'); % 生成OOK信号 t = 0:T:(N*Ts-T); s = zeros(1, length(t)); for i = 1:N if data(i) == 1 s((i-1)*2*T/T+1:i*2*T/T) = 1; end end % 显示OOK信号 subplot(2, 1, 2); plot(t, s); title('OOK信号'); xlabel('时间'); ylabel('幅值'); % 传输信号经过光纤 [ss, tt] = fiber(s, T, L, D, alpha, fc, Ptx, q, R); figure; plot(tt, ss); title('光纤传输后的信号'); xlabel('时间'); ylabel('幅值'); % 显示眼图 eyediagram(ss, 2*Ts/T); title('眼图'); xlabel('时间'); ylabel('幅值'); ``` 在上述代码,我们首先设置了一些参数,如信号长度、采样时间、符号时间等。然后,生成随机比特流,并根据比特流生成OOK信号。接着,将OOK信号传输经过光纤,得到光纤传输后的信号,并在新的图形窗口显示。最后,使用`eyediagram()`函数绘制眼图。 需要注意的是,上述代码使用了名为`fiber()`的函数进行光纤传输的仿真,该函数需要自行编写。此外,眼图的绘制需要使用Signal Processing Toolbox的`eyediagram()`函数,如果没有该工具箱则无法绘制眼图。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值