通过大量向量乘以一个固定矩阵

时间:2013-07-29 15:01:43

标签: optimization hpc micro-optimization

我需要改变一些10 ^ 7个向量的基础,每个向量都有 200坐标。所以我将一个[200 x 200]矩阵乘以10 ^ 7 [200 x 1]个向量。我需要它运行得非常快,但我需要快速编码(一天或更短) 而且我的CUDA很差,所以我不想在CUDA或OpenCL中从头开始编码。也许一些现有的图书馆可以帮我吗?请注意,如果解决方案使用GPGPU,则矩阵应仅转移到GPU一次,否则性能会很差。我可以使用OpenACC(或OpenMP,我不知道)?是否有可能在一天内完成这项工作?

我更喜欢开源解决方案(出于方便和道德的原因)但我可以容忍一个封闭的源解决方​​案,甚至付费(假设它不是太昂贵)。

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

2 个答案:

答案 0 :(得分:1)

你将通过一个巨大的矩阵将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个usec,或者总共4000秒 - 一个多小时。

答案 1 :(得分:1)

您可以将矢量放在一个矩阵中,根据我们的系统,200 * 10 ^ 7可能会同时存在多个空间,因此您可以将其拆分。 然后使用任何针对矩阵矩阵乘法优化的代码,如BLAS。在CPU,GPU(cuBLAS,MAGMA,...),多核(PLASMA,...)或分布式存储器上有许多实现。 由于您将拥有大矩阵,因此比通过矩阵向量乘法获得更好的加速度。