Cudaのエラー「0: copyin Memcpy 〜〜」

Cuda Fortranで計算しようと思ってコンパイル、実行したら、

0: copyin Memcpy (dev=0x0x63a2dc, host=0x0x2b7977d11020, size=1024000) FAILED: 30(unknown error)

とか表示されて、全然計算できない。なんだこれは?と思って、とりあえずwrite文で画面表示させて、どこまで計算できてるか確かめると、どうやらデバイスに転送する手前まで。もしやと思って、

$ pgaccelinfo

を実行すると、

CUDA Driver Version:           9000

だけしか返ってこない。この間再起動したのが原因なのか、やはりビデオカードを読み込めてませんでした…
でもなんで、バージョンが9000なんだろ?意味不明。

もう一度、NVIDIAのドライバをインストールしたら無事に動きました。そうそう再起動しないので、これでいいのです。これからはすぐに気が付くように、ビデオカードのオプションで該当が無ければ、計算をストップするようにしたいと思います。

続き。ちょっと調べて、ファイルサイズが0かどうか調べるようにしました。こんな感じ。

#! /bin/bash
pgaccelinfo |grep tesla > sss
if [ -s sss ]; then
AAA=`cat sss`
BBB=${AAA:21}
echo $BBB
pgfortran -fast -Mcuda=8.0 -acc $BBB sub.cuf main.cuf -lcufft
time ./a.out
else
    echo "Graphic Card not work!"
    exit
fi

Cudaを使うときの、ビデオカードのオプション(-ta=tesla:???)の自動判別

Cuda Fortranを使っているんだけど、ビデオカードによる性能の比較をしてみたくて、色々計算してます。その時に困るのが、カードによって引き渡すオプションが違うこと。例えば

ビデオカード オプション
GTX660,760    -ta=tesla:cc30
GTX1070,1080  -ta=tesla:cc60

というようになっている。これは、pgaccelinfoコマンドの一番下の行で確認できて、

・・・
Async Engines:                 2
Unified Addressing:            Yes
Managed Memory:                Yes
PGI Compiler Option:           -ta=tesla:cc60

のように出力される。これを計算機ごとに変更していては、非常にめんどくさい。ということで、シェルのファイルで自動判別することにしました。流れとしては、pgaccelinfoで表示するデータからgrepして1行取り出し、決まった文字数以降が(-ta=tesla:cc60)などになるようにして、コンパイル時のオプションに引き渡すようにするという手順です。
comp.bashというファイルの中身を、

#! /bin/bash
pgaccelinfo |grep tesla > sss
AAA=`cat sss`
BBB=${AAA:21}
echo $BBB
pgfortran -fast -Mcuda=8.0 -acc $BBB sub.cuf main.cuf -lcufft
time ./a.out

として、

$ bash ./comp.bash

これでとりあえず動いています。1行目とコマンドラインですが、shではダメです。変数の部分選択をやってくれません。
きっともっと賢い方法があると思うんだけど、調べるのもめんどくさいので、これでいいのです。

Ubuntu14.04に、Cuda8.0をインストールでハマる

GTX1070が付いているマシンにUbuntuを入れて、Cuda8.0をインストールしようとしたんだけど、ハマった。色々やっているうちに、Nvidiaのドライバがうまくインストールできなくて、

$ pgaccelinfo

としても、CUDA Driver VersionとNVRM versionの2行くらいしか表示されなかったり、

# modprobe nvidia

として普通にmoduleを読み込めても、それでもpgaccelinfoでは2行しか表示されなかったり。もう訳が分からなくなったので、Cudaのアンインストールと、nvidiaのアンインストールをして、まっさらな状態から入れなおしたら動きました。具体的には、

1.nvidiaのアンインストール

# nvidia-uninstall
# apt-get remove nvidia*

2.Cudaのアンインストール

# /usr/local/cuda/bin/uninstall_cuda_8.0.pl

としてきれいにしてから、とりあえず再起動。

# reboot

3.Nvidiaドライバのインストール

# ./NVIDIA-Linux-x86_64-384.59.run --disable-nouveau

途中で英語で色々聞かれますが、基本そのままでした。

4.Cuda8.0のインストール

./cuda_8.0.61_375.26_linux.run

ここでインストールの際に、NVIDIAのドライバはスキップします。すると最終的に、

Installing the CUDA Toolkit in /usr/local/cuda-8.0 ...

===========
= Summary =
===========

Driver:   Not Selected
Toolkit:  Installed in /usr/local/cuda-8.0
Samples:  Not Selected

Please make sure that
 -   PATH includes /usr/local/cuda-8.0/bin
 -   LD_LIBRARY_PATH includes /usr/local/cuda-8.0/lib64, or, add /usr/local/cuda-8.0/lib64 to /etc/ld.so.conf and run ldconfig as root

To uninstall the CUDA Toolkit, run the uninstall script in /usr/local/cuda-8.0/bin

Please see CUDA_Installation_Guide_Linux.pdf in /usr/local/cuda-8.0/doc/pdf for detailed information on setting up CUDA.

WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 361.00 is required for CUDA 8.0 functionality to work.
To install the driver using this installer, run the following command, replacing with the name of this run file: sudo .run -silent -driver Logfile is /tmp/cuda_install_5632.log
とWARNINGが出ますが、先に新しいNVIDIAドライバを入れてあるので、
# pgaccelinfo

CUDA Driver Version:           9000
NVRM version:                  NVIDIA UNIX x86_64 Kernel Module  384.59  Wed Jul 19 23:53:34 PDT 2017

Device Number:                 0
Device Name:                   GeForce GTX 1070
Device Revision Number:        6.1
Global Memory Size:            8506769408
Number of Multiprocessors:     15
Concurrent Copy and Execution: Yes
Total Constant Memory:         65536
Total Shared Memory per Block: 49152
Registers per Block:           65536
Warp Size:                     32
Maximum Threads per Block:     1024
Maximum Block Dimensions:      1024, 1024, 64
Maximum Grid Dimensions:       2147483647 x 65535 x 65535
Maximum Memory Pitch:          2147483647B
Texture Alignment:             512B
Clock Rate:                    1746 MHz
Execution Timeout:             No
Integrated Device:             No
Can Map Host Memory:           Yes
Compute Mode:                  default
Concurrent Kernels:            Yes
ECC Enabled:                   No
Memory Clock Rate:             4004 MHz
Memory Bus Width:              256 bits
L2 Cache Size:                 2097152 bytes
Max Threads Per SMP:           2048
Async Engines:                 2
Unified Addressing:            Yes
Managed Memory:                Yes
PGI Compiler Option:           -ta=tesla:cc60
となり、ちゃんと動くことがわかります。再起動しても、そのままでした。めでたしめでたし。

Ubuntu14.04で、CUIでのログイン設定

cudaをインストールするときに、

Installing the NVIDIA display driver...
It appears that an X server is running. Please exit X before installation. If you're sure that X is not running, but are getting this error, please delete any X lock files in /tmp.

と怒られた。どうやら、先にXサーバが動いているので、とりあえず止めてからインストールしてくれということらしい。昔は、/etc/inittabというファイルにrunlevelという項目があって、そこを適当に編集(例えば「5」⇒「3」)に変更すれば、GUIからCUIに変更できた。でもそれが無くなっていて、別の方法が必要みたい。恐らくすぐに忘れるので、メモ。

1./etc/default/grubファイルを一部編集

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
↓
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash text"

2.grubの変更を反映

# update-grub

以上で、再起動すればCUIでログインできるようになるはず。

GPGPUで、とりあえず各プロセスの時間を知りたい

やっとGPGPUに手を出しました。まとまった時間が無いと、とても手が付けられませんでしたが、とりあえず。コンパイルできたら、

$ pgprof -f -o a.prof ./a.out

として、

$ pgprof -i a.prof

です。いろいろ出てきます。ただのメモです。