Optimization 将一个固定矩阵乘以大量向量

Optimization 将一个固定矩阵乘以大量向量,optimization,hpc,micro-optimization,Optimization,Hpc,Micro Optimization,我需要改变10^7个向量的基,每个向量都有 200坐标。所以我将把一个[200x200]矩阵乘以10^7[200x1]向量。我需要它运行得非常快,但我需要快速编码(一天或更短) 我的CUDA很差,所以我不想用CUDA或OpenCL从头开始编写代码。也许现有的图书馆可以帮我做?请注意,如果解决方案使用GPGPU,则矩阵只应传输到GPU一次,否则性能将很差。我可以使用OpenACC(或OpenMP,我不知道)吗?有可能在一天内完成吗 我更喜欢开源解决方案(出于方便和道德原因),但我可以容忍封闭源代码

我需要改变10^7个向量的基,每个向量都有 200坐标。所以我将把一个[200x200]矩阵乘以10^7[200x1]向量。我需要它运行得非常快,但我需要快速编码(一天或更短) 我的CUDA很差,所以我不想用CUDA或OpenCL从头开始编写代码。也许现有的图书馆可以帮我做?请注意,如果解决方案使用GPGPU,则矩阵只应传输到GPU一次,否则性能将很差。我可以使用OpenACC(或OpenMP,我不知道)吗?有可能在一天内完成吗

我更喜欢开源解决方案(出于方便和道德原因),但我可以容忍封闭源代码的解决方案,即使是付费的(假设成本不太高)

这是我的论文。
谢谢你的关注。

你将用一个巨大的矩阵乘以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.
}
void multTheMatrixByTheVector(双a[200],双b[200]){
b[0]=0
+a[0]*
+a[1]*
...
+a[199]*
;
b[1]=0
+a[0]*
+a[1]*
...
+a[199]*
;
...
b[199]=等。
}
你看,这个函数大约有40000行长,但是一个好的编译器应该能够处理它。 当然,如果任何矩阵元素为零,即存在一些稀疏性,则可以忽略这些行(或者让编译器优化器来做)。 要在CUDA或矢量化指令上执行此操作,您必须相应地修改它,但这应该是可以做到的

当您将该功能包含在主程序中时,它应该能够以机器所能达到的速度运行。 它不会浪费任何周期进行索引计算、循环测试或与空矩阵单元相乘


如果每次乘法和加法需要10纳秒,我的信封背面说每个向量需要400 usec,或者总共需要4000秒——一个多小时。

你可以将向量放入一个矩阵中,200*10^7一次可能需要很大的空间,这取决于我们的系统,所以你可以拆分它。 然后使用任何为矩阵乘法优化的代码,比如BLAS。在CPU、GPU(cuBLAS、MAGMA等)、多核(PLASMA等)或分布式内存上有许多实现。 因为你将有一个大的矩阵,你将有一个更好的加速比做矩阵向量乘法