当前位置: 首页 > 科技观察

在单核M1CPU上实现FP321.5TFlops计算能力?这是一个代码指南

时间:2023-03-15 14:34:42 科技观察

1.5TFlops有什么魅力?首先,这是在电池供电的单核MacBookAir2020上运行;其次,每条指令的延迟约为0.5纳秒。那些强大的加速器或者GPU张量核心不是我们考虑的范围。我们在这里谈论的是距离CPU寄存器一个周期的实际线性代数性能。奇怪的是,Apple一直向我们隐瞒这一点。在本文中,我们将通过一些代码来揭开迷雾。什么是AMX协处理器?可以说是SIMD的典范。一个重要的区别是AMX:CPU的比例不是1:1;并非每个核心都有自己的AMX协处理器。以下是加载或存储值的规范:最小值与完整的AVX512寄存器一样宽但是这些值是从哪里加载或存储的?显然,这样的大小会很快填满整个NEON寄存器文件。AMX有一个单独的寄存器文件,这有点奇怪。寄存器分为三组:X、Y和Z。对于每条指令,X和Y组保存输入,Z组保存输出。如我们所见,X和Y非常大。中间有一个完整的KB。Z很神奇,然后是一些:(剧透:一条AMX指令可以填充1024字节(Z寄存器的1/4)。)那么如何从X和Y到Z?方式太多,不太适合ISA编码。因此Apple决定将大部分指令信息编码到通用寄存器中。这个决定被证明是一个好决定,因为代码的运行时(动态)配置可以在AMX上执行。本文旨在提高协处理器的利用效率。有矢量-矢量指令可以输出相同长度的矢量,而不会使芯片的计算能力饱和。相反,它必须借助外积来完成。什么是外积?假设您有两个输入向量u和v:外积是一个矩阵,其中包含可能的元素对的乘积。(这里有一些关于为什么Z寄存器组比X和Y大得多的提示。)在AMX芯片上,它归结为一个非常简单的指令,像这样:-accumulate:有了这个,我们就有了编写矩阵乘法所需的东西:从输入矩阵重复加载16个浮点数,并将它们的外部累加添加到16x16输出。缩小K尺寸也没关系!让我们简化问题并隐式转置矩阵乘法。A和B(输入)都以K(缩减维度)作为主导维度。这在实践中并不重要,但它大大简化了我们的代码。这是检查我们提出的解决方案的参考:voidreference_16x16xK(float*A,float*B,float*C,uint64_tK){for(uint32_tm=0;m<16;++m){for(uint32_tn=0;n<16;++n){C[n*16+m]=0;对于(uint32_tk=0;k