dgemm nvblas gpu 卸载

dgemm nvblas gpu offload

我有执行矩阵乘法的测试应用程序,并尝试使用 nvblas 卸载到 gpu。

#include <armadillo>
#include <iostream>
using namespace arma;
using namespace std;
int main(int argc, char *argv[]) {
    int m = atoi(argv[1]);
    int k = atoi(argv[2]);
    int n = atoi(argv[3]);
    int t = atoi(argv[4]);
    std::cout << "m::" << m << "::k::" << k << "::n::" << n << std::endl;
    mat A;
    A = randu<mat>(m, k);
    mat B;
    B = randu<mat>(k, n);
    mat C;
    C.zeros(m, n);
    cout << "norm c::" << arma::norm(C, "fro") << std::endl;
    tic();
    for (int i = 0; i < t; i++) {
      C = A * B;
    }
    cout << "time taken ::" << toc()/t << endl;
    cout << "norm c::" << arma::norm(C, "fro") << std::endl;
  }

我编译代码如下

CPU

g++ testmm.cpp -I$ARMADILLO_INCLUDE_DIR -lopenblas -L$OPENBLAS_ROOT/lib/ --std=c+11 -o a.cpu.out

GPU

g++ testmm.cpp -I$ARMADILLO_INCLUDE_DIR -lopenblas -L$OPENBLAS_ROOT/lib/ --std=c+11 -lnvblas -L$CUDATOOLKIT_HOME/lib64 -o a.cuda.out

当我用 4096 4096 4096 运行 a.cpu.out 和 a.cuda.out 时,他们都用了大约 11 秒的时间。我没有看到 a.gpu.out 的时间减少。在 nvblas.conf 中,除了 (a) 更改启用 openblas 的路径 (b)auto_pin 内存之外,我将所有内容保留为默认值。我看到 nvblas.log 说使用 "Devices 0" 而没有其他输出。 nvidia-smi 没有显示 gpu activity 有任何增加,nvprof 显示了一堆 cudaMalloc、cudamemcpy、查询设备功能等。但是不存在任何 gemm 调用。

a.cuda.out 上的 ldd 显示它与 nvblas、cublas、cudart 和 cpu openblas 库链接。我在这里有什么错误吗?

那里的链接顺序有问题。当我对 gpu 执行以下操作时,问题得到解决。

GPU

g++ testmm.cpp -lnvblas -L$CUDATOOLKIT_HOME/lib64 -I$ARMADILLO_INCLUDE_DIR -lopenblas -L$OPENBLAS_ROOT/lib/ --std=c+11 -o a.cuda.out

根据以上内容,当我转储符号表时,我看到以下输出。

nm a.cuda.out | grep -is dgemm
             U cblas_dgemm
             U dgemm_@@libnvblas.so.9.1 <-- this shows correct linking and ability to offload to gpu.

如果链接不正确,会出现如下链接问题。

nm a.cuda.out | grep -is dgemm
             U cblas_dgemm
             U dgemm_  <-- there will not be a libnvblas here showing it is a problem.

虽然在上述两种情况下ldd都会显示nvblas、cublas、cudart、openblas,但在执行程序时,dgemm始终是openblas。