你将把 1000 万个大向量乘以一个对所有向量都相同的巨大矩阵。如果所有可能的决策都可以提前编译出来,那将是最快的。换句话说,有大量的指数计算和循环测试会被重复数百万次。这听起来像是预编译的完美案例:
编写一个小程序,将 200x200 矩阵数据值作为输入,并让它打印出一段程序文本,定义一个能够输入输入向量并输出结果向量的函数。它可能看起来像这样:
void multTheMatrixByTheVector(double a[200], double b[200]){
b[0] = 0
+ a[0] * <a constant, the value of mat[0][0]>
+ a[1] * <a constant, the value of mat[1][0]>
...
+ a[199] * <a constant, the value of mat[199][0]>
;
b[1] = 0
+ a[0] * <a constant, the value of mat[0][1]>
+ a[1] * <a constant, the value of mat[1][1]>
...
+ a[199] * <a constant, the value of mat[199][1]>
;
...
b[199] = etc. etc.
}
你看,这个函数大约有 40000 行长,但是一个像样的编译器应该能够处理它。当然,如果任何矩阵元素为零,即存在一些稀疏性,您可以省略这些行(或让编译器优化器来做)。要在 CUDA 或矢量化指令上执行此操作,您必须相应地对其进行修改,但这应该是可行的。
当您在主程序中包含该功能时,它应该能够以与机器运行速度一样快的速度运行。它不会浪费任何循环进行索引计算、循环测试或乘以空矩阵单元。
然后,如果每次乘法和加法需要 10ns,我的信封背面说每个向量应该需要 400 微秒,或者总共需要 4000 秒 - 一个多小时。