我有一个执行矩阵乘法的测试应用程序,并试图用 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;
}
我编译代码如下。
中央处理器
g++ testmm.cpp -I$ARMADILLO_INCLUDE_DIR -lopenblas -L$OPENBLAS_ROOT/lib/ --std=c+11 -o a.cpu.out
图形处理器
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 说使用“设备 0”而没有其他输出。nvidia-smi 没有显示 gpu 活动有任何增加,而 nvprof 显示了一堆 cudaMalloc、cudamemcpy、查询设备功能等。但是不存在任何 gemm 调用。
a.cuda.out 上的 ldd 显示它与 nvblas、cublas、cudart 和 cpu openblas 库链接。我在这里犯了什么错误吗?