1

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

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

这是我的论文。感谢您的关注。

4

2 回答 2

1

您可以将向量放入矩阵中,根据我们的系统,200 * 10^7 一次可能有很多空间,因此您可以拆分它。然后,您可以使用针对矩阵矩阵乘法优化的任何代码,例如 BLAS。在 CPU、GPU(cuBLAS、MAGMA、...)、多核(PLASMA、...)或分布式内存上有许多实现。由于您将拥有大矩阵,因此您将获得比进行矩阵向量乘法更好的加速。

于 2013-07-30T11:38:53.223 回答
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 微秒,或者总共需要 4000 秒 - 一个多小时。

于 2013-07-30T01:44:01.790 回答