CUDA nvprof実行時に「Warning: ERR_NVGPUCTRPERM - The user does not have permission to profile on the target device.」

こちらのチュートリアルを試している時、
https://cuda-tutorial.readthedocs.io/en/latest/tutorials/tutorial01/

nvprofでプロファイルを取得しています。
実行してみるとエラーが発生。


$ nvprof ./vector_add_cuda
==11202== NVPROF is profiling process 11202, command: ./vector_add_cuda
3.000000
==11202== Warning: ERR_NVGPUCTRPERM - The user does not have permission to profile on the target device. See the following link for instructions to enable permissions and get more information: https://developer.nvidia.com/ERR_NVGPUCTRPERM
==11202== Profiling application: ./vector_add_cuda
==11202== Profiling result:
No kernels were profiled.
No API activities were profiled.
==11202== Warning: Some profiling data are not recorded. Make sure cudaProfilerStop() or cuProfilerStop() is called before application exit to flush profile data.






sudo



エラーで表示されるページを見てみます。
https://developer.nvidia.com/ERR_NVGPUCTRPERM


On Linux targets: Launch the tool with 'sudo' or as a user with the CAP_SYS_ADMIN capability set



sudoで実行しろとのこと。


$ sudo nvprof ./vector_add_cuda
sudo: nvprof: コマンドが見つかりません



nvprofをフルパスで指定。


$ sudo /usr/local/cuda-10.1/bin/nvprof ./vector_add_cuda



これで実行できました。

CUDA プログラミング CUDAで「Hello World」

CUDA 10.1をインストールし、サンプルプログラムをビルドしてみました。
CUDA プログラミング CUDA 10.1のインストールと付属サンプルのビルド&実行

実際にプログラムを作成してみます。
こちらを参考に「Hello World」を表示してみます。
Tutorial 01: Say Hello to CUDA


nvcc



コンパイルには「nvcc」というコマンドを実行します。
実体は「/usr/local/cuda-10.1/bin/nvcc」
パスが通っていなかったので設定しておきました。


$ vi ~/.bash_profile



内容は
https://docs.nvidia.com/cuda/cuda-quick-start-guide/index.html
上記の記載に従います。


export PATH=/usr/local/cuda-10.1/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.1/lib64\${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}



内容を反映。


$ source ~/.bash_profile



これで準備完了です。



Hello World



チュートリアルに、C言語との比較が掲載されています。

・C言語


  1. void c_hello(){
  2.     printf("Hello World!\n");
  3. }
  4. int main() {
  5.     c_hello();
  6.     return 0;
  7. }



・CUDA


  1. __global__ void cuda_hello(){
  2.     printf("Hello World from GPU!\n");
  3. }
  4. int main() {
  5.     cuda_hello<<<1,1>>>();
  6.     return 0;
  7. }



「__global__」はGPU呼び出し。
「<<<...>>>」の部分は次節で説明とのことなので、そういうものだと思っておきます。
「main」がkernelsと呼ばれる部分での実行になるとのこと。

https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html
ここの解説を見ると、kernelsからGPU関数の呼び出しが行われるようです。

CUDA Tutorial
こちらを見ると、kernelsはhost(≒CPU)で実行されるという理解で良いのかもしれません。

CUDAのサンプルプログラムを「hello.cu」という名前で保存します。

・hello.cu


  1. #include <stdio.h>
  2. __global__ void cuda_hello(){
  3.     printf("Hello World from GPU!\n");
  4. }
  5. int main() {
  6.     cuda_hello<<<1,1>>>();
  7.     return 0;
  8. }



nvccでコンパイル。


$ nvcc hello.cu -o hello



実行してみます。


$ ./hello



...が何も表示されず。
特にエラーも表示されないので、これが正しい実行結果なのでしょうか。
とりあえずチュートリアルを先に進めます。



GPUによる演算



同じ長さの2つの配列の中身を加算し、1つの配列にまとめる処理をサンプルとします。

・vector_add.c


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define N 10000000
  4. void vector_add(float *out, float *a, float *b, int n) {
  5.     for(int i = 0; i < n; i++){
  6.         out[i] = a[i] + b[i];
  7.     }
  8. }
  9. int main(){
  10.     float *a, *b, *out;
  11.     // Allocate memory
  12.     a = (float*)malloc(sizeof(float) * N);
  13.     b = (float*)malloc(sizeof(float) * N);
  14.     out = (float*)malloc(sizeof(float) * N);
  15.     // Initialize array
  16.     for(int i = 0; i < N; i++){
  17.         a[i] = 1.0f; b[i] = 2.0f;
  18.     }
  19.     // Main function
  20.     vector_add(out, a, b, N);
  21.     printf("%f\n", out[0]);
  22. }



ビルドして実行


$ g++ vector_add.c -o vector_add_c
$ ./vector_add_c
3.000000



このプログラムをGPU版に変更してみます。

・vector_add.cu


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <cuda.h>
  4. #include <cuda_runtime.h>
  5. #define N 10000000
  6. __global__ void vector_add(float *out, float *a, float *b, int n) {
  7.     for(int i = 0; i < n; i++){
  8.         out[i] = a[i] + b[i];
  9.     }
  10. }
  11. int main(){
  12.     float *a, *b, *out;
  13.     float *d_a, *d_b, *d_out;
  14.     // Allocate memory
  15.     a = (float*)malloc(sizeof(float) * N);
  16.     b = (float*)malloc(sizeof(float) * N);
  17.     out = (float*)malloc(sizeof(float) * N);
  18.     // Initialize array
  19.     for(int i = 0; i < N; i++){
  20.         a[i] = 1.0f; b[i] = 2.0f;
  21.     }
  22.     
  23.     // Allocate device memory
  24.     cudaMalloc((void**)&d_a, sizeof(float) * N);
  25.     cudaMalloc((void**)&d_b, sizeof(float) * N);
  26.     cudaMalloc((void**)&d_out, sizeof(float) * N);
  27.     // Transfer data from host to device memory
  28.     cudaMemcpy(d_a, a, sizeof(float) * N, cudaMemcpyHostToDevice);
  29.     cudaMemcpy(d_b, b, sizeof(float) * N, cudaMemcpyHostToDevice);
  30.     // Executing kernel
  31.     vector_add<<<1,1>>>(d_out, d_a, d_b, N);
  32.     // Transfer data back to host memory
  33.     cudaMemcpy(out, d_out, sizeof(float) * N, cudaMemcpyDeviceToHost);
  34.     printf("%f\n", out[0]);
  35.     // Deallocate device memory
  36.     cudaFree(d_a);
  37.     cudaFree(d_b);
  38.     cudaFree(d_out);
  39.     // Deallocate host memory
  40.     free(a);
  41.     free(b);
  42.     free(out);
  43. }



ビルドと実行


$ nvcc vector_add.cu -o vector_add_cuda
$ ./vector_add_cuda
3.000000



あまり意味のない計算ですが、動いてくれたようです。


なんとなく理解したことは
・devide(GUP)で演算に使用するメモリは「cudaMalloc」で確保する。
・メモリの開放は「cudaFree」
・cudaMemcpyで、kernel領域のメモリをdevice領域にコピーして利用する。
・deviceの演算結果はcudaMemcpyでdevice領域からkernel領域にコピーして利用する。

次回はもう少し実用的な演算を試してみたいと思います。



【参考URL】
Tutorial 01: Say Hello to CUDA
CUDA Tutorial
https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html
https://docs.nvidia.com/cuda/cuda-samples/index.html
https://docs.nvidia.com/cuda/cuda-quick-start-guide/index.html

CUDA プログラミング CUDA 10.1のインストールと付属サンプルのビルド&実行

せっかく高価なGPU(GeForce RTX 2080)を買ったので、
CUDAによるGPUプログラムを試してみようと思います。
※PyTorchやtensorflowでCUDA系のエラーが出た時、対応できるようになるかもという思惑もあります。

環境は
・Ubuntu 18.04
・GeForce RTX 2080
・CUDA 10.1
です。


CUDA 10.1のインストール



CUDA 10.0のインストールと同じ手順です。
Ubuntu 18.04 NVIDIAドライバー、CUDAのインストール

こちらのページでインストールコマンドを確認します。
https://developer.nvidia.com/cuda-downloads

a00_01.png

Operating System:Linux
Architecture:x86_64
Distribution:Ubuntu
Version:18.04
Installer Type:deb(network)
を選択すると、以下のコマンドが確認できるので実行します。


$ sudo dpkg -i cuda-repo-ubuntu1804_10.1.168-1_amd64.deb
$ sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
$ sudo apt-get update
$ sudo apt-get install cuda



インストールしたら再起動。


$ sudo reboot




再起動後、「nvidia-smi」コマンドでGPUやCUDAの情報が表示されたらOKです。


$ nvidia-smi
Tue Jul 2 23:18:48 2019    
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.67     Driver Version: 418.67     CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap|         Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce RTX 2080    On | 00000000:09:00.0 On |                 N/A |
| 41% 36C    P8    16W / 225W |    691MiB / 7949MiB |     2%     Default |
+-------------------------------+----------------------+----------------------+
                                                                            
+-----------------------------------------------------------------------------+
| Processes:                                                     GPU Memory |
| GPU     PID Type Process name                             Usage     |
|=============================================================================|
|    0     1340     G /usr/lib/xorg/Xorg                            24MiB |
|    0     1416     G /usr/bin/gnome-shell                         58MiB |
|    0     2358     G /usr/lib/xorg/Xorg                         245MiB |
|    0     2494     G /usr/bin/gnome-shell                         154MiB |
|    0     3033     G ...uest-channel-token=15395474465860944717 170MiB |
|    0     15035     G ...-token=86FB9E2E2E2462B636173F417C97BB29    36MiB |
+-----------------------------------------------------------------------------+



a00_02.png




付属サンプルのビルド



この辺を参考にしました。
https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html
https://docs.nvidia.com/cuda/cuda-samples/index.html
https://docs.nvidia.com/cuda/cuda-quick-start-guide/index.html

CUDA 10.1のインストールパスは
「/usr/local/cuda-10.1/bin/」
になっているはずです。

ここに「cuda-install-samples-10.1.sh」があるので実行します。
※最後の「sample」はディレクトリ名です。このディレクトリが作成され、サンプルプログラムが展開されます。


$ /usr/local/cuda-10.1/bin/cuda-install-samples-10.1.sh sample
Copying samples to sample/NVIDIA_CUDA-10.1_Samples now...



上記のコマンドを実行すると、sample/NVIDIA_CUDA-10.1_Samplesが作成されます。

a00_03.png

sample/NVIDIA_CUDA-10.1_Samplesに移動。


$ cd sample/NVIDIA_CUDA-10.1_Samples



makeでビルドを実行します。


$ make



「bin/x86_64/linux/release/」にビルド結果が出力されます。

a00_04.png

適当なサンプルを実行してみます。


$ bin/x86_64/linux/release/volumeRender



a00_05.png

マウスでぐりぐり動かせます。

a00_06.png

nvidia-smiを実行すると、ちゃんとGPUが利用されているようです。

a00_07.png

これでCUDAプログラムがビルドできることが確認できました。
次は実際にプログラムを作成してみます。


【参考URL】
https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html
https://docs.nvidia.com/cuda/cuda-samples/index.html
https://docs.nvidia.com/cuda/cuda-quick-start-guide/index.html

Ubuntu 18.04 NVIDIAドライバー、CUDAのインストール

Ubuntu 18.04 + GeForce RTX 2080の環境にドライバーとCUDAをインストールしたときのメモ。
※記憶があやふやなので、確証は無し。


NVIDIAドライバー



ここから自分の環境にあった設定で検索。
https://www.nvidia.com/Download/index.aspx

948_01.png

948_02.png


ダウンロードしたファイルに実行権限を付与して実行。
※ライブラリが不足していてエラーが発生。都度要求されたライブラリをインストールしたがメモが残っておらず。


$ chmod +x NVIDIA-Linux-x86_64-410.93.run
$ sudo ./NVIDIA-Linux-x86_64-410.93.run




インストール後、nvidia-smiを実行して確認。


$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.78     Driver Version: 410.78     CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| GPU Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap|         Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce RTX 2080    Off | 00000000:09:00.0 On |                 N/A |
| 41% 32C    P8    17W / 225W |    495MiB / 7949MiB |     23%     Default |
+-------------------------------+----------------------+----------------------+
                                                                            
+-----------------------------------------------------------------------------+
| Processes:                                                     GPU Memory |
| GPU     PID Type Process name                             Usage     |
|=============================================================================|
|    0     1398     G /usr/lib/xorg/Xorg                            24MiB |
|    0     1431     G /usr/bin/gnome-shell                         58MiB |
|    0     1626     G /usr/lib/xorg/Xorg                         190MiB |
|    0     1758     G /usr/bin/gnome-shell                         129MiB |
+-----------------------------------------------------------------------------+



この時点でCUDAがインストールされていた模様。
以下のCUDAインストールは不要だったのかもしれない。



CUDA 10



こちらの手順に従いインストール。
CUDA Toolkit 10.0 Download

cuda-repo-ubuntu1804_10.0.130-1_amd64.debをダウンロードして
以下のコマンドを実行。


$ sudo dpkg -i cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
$ sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
$ sudo apt update
$ sudo apt install cuda



インストールが終わったら再起動。


$ sudo reboot




再起動後、nvidia-smiで内容を表示。


$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.79     Driver Version: 410.79     CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| GPU Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap|         Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce RTX 2080    Off | 00000000:09:00.0 On |                 N/A |
| 40% 36C    P0    47W / 225W |    319MiB / 7949MiB |     1%     Default |
+-------------------------------+----------------------+----------------------+
                                                                            
+-----------------------------------------------------------------------------+
| Processes:                                                     GPU Memory |
| GPU     PID Type Process name                             Usage     |
|=============================================================================|
|    0     1425     G /usr/lib/xorg/Xorg                            24MiB |
|    0     1491     G /usr/bin/gnome-shell                         58MiB |
|    0     1677     G /usr/lib/xorg/Xorg                         144MiB |
|    0     1813     G /usr/bin/gnome-shell                         90MiB |
+-----------------------------------------------------------------------------+



NVDIAのドライババージョンが上がっている。
ひょっとしたら、ドライバをインストールしなくてもCUDAだけインストールすれば
自動的にドライバもインストールされたのかもしれない。

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
Symfoware まとめ

PR




検索フォーム

月別アーカイブ