NVBLAS 静默失败半大矩阵乘法
NVBLAS silently fails for semi-large matrix multiplication
我按照说明 here 使用 nvblas 进行了 运行 八度音阶。我安装了 CUDA 工具包 7.5 和一个 tesla k40c GPU。为了用 nvblas 开始八度,我使用了 LD_PRELOAD=libnvblas.so octave
。然后我运行下面的简单代码:
N = 256
A = rand(N,N)
B = rand(N,N)
A*B
生成一个具有合理值的矩阵。但是,如果我将 N 增加到 512,或任何超过 512 的数字,结果我会得到所有零(或非常小的数字)。
如果我使用 OpenBLAS,则不会发生这种情况。矩阵应该足够小以适合卡的 RAM (12GB)。知道为什么会发生这种情况吗?
注意:如果我制作 A 和 B 单位矩阵,这不会发生,但 A = B = ones(N,N) 时仍然会发生。
抱歉,这个问题有些陈旧,但我在带有 k80 gpu 的 Amazon AWS EC2 p2.xlarge 实例上尝试过,它似乎有效。
当我在 nvblas.conf 中使用默认 "NVBLAS_GPU_LIST 0 1" 设置时,我得到了与您相似的结果(很多零),这似乎指的是两个 GPU,所以我将其更改为只有一个它奏效了。完整文件如下:
#Put here the CPU BLAS fallback Library of your choice
NVBLAS_CPU_BLAS_LIB libopenblas.so
# Specify which output log file (default is stderr)
NVBLAS_LOGFILE nvblas.log
# List of GPU devices Id to participate to the computation
# By default if no GPU are listed, only device 0 will be used
NVBLAS_GPU_LIST 0
NVBLAS_AUTOPIN_MEM_ENABLED
程序 (t1.m) 从 NVidia link 稍作修改,以计算输出矩阵中非零的数量:
N = 16384;
# from the original NVidia example:
#A = single(rand(N,N));
#B = single(rand(N,N));
# double precision seems to work fine (not checked in detail)
A = rand(N,N);
B = rand(N,N);
start = clock();
C = A * B;
elapsedTime = etime(clock(), start);
disp(elapsedTime);
gFlops = 2*N*N*N/(elapsedTime * 1e+9);
disp(gFlops);
disp("number of elements >0:")
disp(sum(sum(C > 0)));
disp("Should be:")
disp(N*N)
仅供参考 这是 nvidia-smi 的输出,同时它是 运行 如上所述(它在 172MiB 使用时达到峰值,N=16384):
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.51 Driver Version: 375.51 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla K80 Off | 0000:00:1E.0 Off | 0 |
| N/A 44C P0 80W / 149W | 80MiB / 11439MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 21080 C /usr/bin/octave-cli 78MiB |
+-----------------------------------------------------------------------------+
这是我之前安装的 nvidia 和 cuda 文件:
cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64-deb
libcudnn5-dev_5.1.10-1+cuda8.0_amd64.deb
libcudnn5_5.1.10-1+cuda8.0_amd64.deb
nvidia-driver-local-repo-ubuntu1604_375.51-1_amd64.deb
我似乎得到了大约 8.6 的加速,普通八度音程大约有 55 gflops,GPU 版本大约有 478 gflops。
我按照说明 here 使用 nvblas 进行了 运行 八度音阶。我安装了 CUDA 工具包 7.5 和一个 tesla k40c GPU。为了用 nvblas 开始八度,我使用了 LD_PRELOAD=libnvblas.so octave
。然后我运行下面的简单代码:
N = 256
A = rand(N,N)
B = rand(N,N)
A*B
生成一个具有合理值的矩阵。但是,如果我将 N 增加到 512,或任何超过 512 的数字,结果我会得到所有零(或非常小的数字)。
如果我使用 OpenBLAS,则不会发生这种情况。矩阵应该足够小以适合卡的 RAM (12GB)。知道为什么会发生这种情况吗?
注意:如果我制作 A 和 B 单位矩阵,这不会发生,但 A = B = ones(N,N) 时仍然会发生。
抱歉,这个问题有些陈旧,但我在带有 k80 gpu 的 Amazon AWS EC2 p2.xlarge 实例上尝试过,它似乎有效。
当我在 nvblas.conf 中使用默认 "NVBLAS_GPU_LIST 0 1" 设置时,我得到了与您相似的结果(很多零),这似乎指的是两个 GPU,所以我将其更改为只有一个它奏效了。完整文件如下:
#Put here the CPU BLAS fallback Library of your choice
NVBLAS_CPU_BLAS_LIB libopenblas.so
# Specify which output log file (default is stderr)
NVBLAS_LOGFILE nvblas.log
# List of GPU devices Id to participate to the computation
# By default if no GPU are listed, only device 0 will be used
NVBLAS_GPU_LIST 0
NVBLAS_AUTOPIN_MEM_ENABLED
程序 (t1.m) 从 NVidia link 稍作修改,以计算输出矩阵中非零的数量:
N = 16384;
# from the original NVidia example:
#A = single(rand(N,N));
#B = single(rand(N,N));
# double precision seems to work fine (not checked in detail)
A = rand(N,N);
B = rand(N,N);
start = clock();
C = A * B;
elapsedTime = etime(clock(), start);
disp(elapsedTime);
gFlops = 2*N*N*N/(elapsedTime * 1e+9);
disp(gFlops);
disp("number of elements >0:")
disp(sum(sum(C > 0)));
disp("Should be:")
disp(N*N)
仅供参考 这是 nvidia-smi 的输出,同时它是 运行 如上所述(它在 172MiB 使用时达到峰值,N=16384):
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.51 Driver Version: 375.51 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla K80 Off | 0000:00:1E.0 Off | 0 |
| N/A 44C P0 80W / 149W | 80MiB / 11439MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 21080 C /usr/bin/octave-cli 78MiB |
+-----------------------------------------------------------------------------+
这是我之前安装的 nvidia 和 cuda 文件:
cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64-deb
libcudnn5-dev_5.1.10-1+cuda8.0_amd64.deb
libcudnn5_5.1.10-1+cuda8.0_amd64.deb
nvidia-driver-local-repo-ubuntu1604_375.51-1_amd64.deb
我似乎得到了大约 8.6 的加速,普通八度音程大约有 55 gflops,GPU 版本大约有 478 gflops。