对于#include <stdio.h> #include <arm_neon.h> static void matrix_mul_asm(uint16_t **aa,uint16_t **bb,uint16_t **cc) { uint16_t *a=(uint16_t *)aa; uint16_t *b=(uint16_t *)bb; uint16_t *c=(uint16_t *)cc; __asm__ __volatile__ ( "ld4 {v0.4h-v3.4h},[%0]\n" "ld4 {v4.4h,v5.4h,v6.4h,v7.4h},[%1]\n" "mul v3.4h,v3.4h,v7.4h\n" "mul v2.4h,v2.4h,v6.4h\n" "mul v1.4h,v1.4h,v5.4h\n" "mul v0.4h,v0.4h,v4.4h\n" "st4 {v0.4h,v1.4h,v2.4h,v3.4h},[%2]\n" :"+r"(a),"+r"(b),"+r"(c) : :"cc","memory","v0","v1","v2","v3","v4","v5","v6","v7" ); } int main() { uint16_t aa[4][4]={ {1,8,2,4}, //自己学号的高四位,比如学号为19374331,此处应为{1,9,3,7}, {1,0,5,5}, //自己学号的低四位,比如学号为19374331,此处应为{4,3,3,1}, {3,6,8,1}, {2,6,7,1} }; uint16_t bb[4][4]={ {1,3,5,7}, {2,4,6,8}, {2,5,7,9}, {5,2,7,1} }; uint16_t cc[4][4]={0}; int i,j; matrix_mul_asm((uint16_t **)aa,(uint16_t **)bb,(uint16_t **)cc); for(i=0;i<4;i++) for(j=0;j<4;j++) printf("NO 18241055,cc[%1u][ %1u] out is %11u \n",i,j,cc[i][j]); //19374331位置处填写自己学号 return 0; } 试着解决如下问题: 同样是实现4*4乘法,用非SIMD的常规指令,采用内嵌汇编代码的方式实现一遍,比较一下用与不用SIMD指令的性能差异;如果是8*8,16*16等乘法,这种性能差异会怎样变化?
时间: 2024-04-26 15:23:50 浏览: 43
SeqList.h #include <stdio.h> //包含标准输入输出流的头文件 #include <assert.h
这段代码是在ARM平台上使用NEON指令集实现的矩阵乘法,它提供了SIMD指令加速处理。如果采用非SIMD的常规指令实现矩阵乘法,性能会比使用NEON指令慢很多,因为常规指令不能同时处理多个数据,需要逐个处理,而NEON指令可以同时处理多个数据,加速了计算。如果是实现8*8,16*16等乘法,使用NEON指令集的优势会更加明显,因为处理的数据量更大,使用NEON指令可以大大提高计算效率。
阅读全文