CUDA-Fortranで、pgprofするとmemcpyでエラー
CUDA-Fortranでプログラム書いてるけど、チューニングしたくて各プロセスでの時間を知りたい。前に調べたときに、
$ pgprof -f -o a.prof ./a.out
$ pgprof -i a.prof
でOKと書いてあったので、そのまま実行・・・するとエラー出ました。エラーは、
0: copyover Memcpy (dst=0x2b8757a50000, src=0x2b8757a20000, size=65536) FAILED: 700(an illegal memory access was encountered)
という感じ。pgprofを付けずに実行すると普通に計算できるので、意味不明です。ちょっと調べたら、とりあえずコンパイル時に、-Mcuda=lineinfoを付けなさいとあったので、付けたら少し計算できて、やっぱり同じエラー。
わけわからんので色々調べましたが、どうやら変数にvolatile属性?を付けるとハッピーになれる場合があるとあったので、エラーの出ているサブルーチン部分で付けてみましたが、変わらず。
さらに調べたら、cuda-memcheckなるコマンドを実行すると、何かわかるかもしれないということで、
$ cuda-memcheck pgprof -f -o a.prof ./a.out
とすると、今度はなぜか普通に計算できて、
$ pgprof -i a.prof
で、各プロセスの時間がわかるようになりました。でも、CPU時間のみです。目的のGPU時間がわかりません。実行すると以下のようなエラーが出てます。まったく意味が分かりません。
Error: Internal profiling error 4917:23
行き詰ってます。誰か、教えて。
exportsの編集結果を反映させたい
自分のマシンでGPGPUでの開発環境を作るため、Windows10 Pro上のVirtualBOXにUbuntu16をインストールして、色々やろうと思ってます。そのために、外部で動いているシステムをNFSでマウントしたいんですが、exportsで制限がかかっているために、できませんでした。そこで、ファイルをちょこっと編集して反映させたかったんですが、再起動に不都合があったため、編集結果を反映させる方法を調べました。
# exportfs -ra
で、そのまま反映されます。
ubuntu16.04で、CUIログイン
ちょっと前にubuntuを14から16へアップデートしたら、CUIログインじゃなくなってた。
ubuntu14では、/etc/default/grub内で
GRUB_CMDLINE_LINUX_DEFAULT="text quiet splash"
とすればよかったけど、ubuntu16では、
GRUB_CMDLINE_LINUX_DEFAULT="systemd.unit=multi-user.target quiet nosplash"
らしい。そのあと再起動すると、CUIでログインできるはず。
# reboot
以下のサイトを見ました。ありがとうございました。
http://namco.hatenablog.jp/entry/2017/02/16/032013
ubuntu 16.04にアップデートしたら、NISが動かなくなった
計算機諸々をubuntu14.04で動かしてますが、あと1年もしたら管理できなくなるので、アップデートしてます。アップデートは前にも書いたけど、
# aptitude update # aptitude upgrade
して、念のため再起動してから
# reboot
例のコマンド
# do-release-upgrade
です。途中で、「設定ファイルが新しくなるけど、これまで使ってたカスタマイズ済みのやつを使う?使わない?差分見る?」みたいなことを色々聞かれましたが、基本デフォルトでした。
で、1時間くらいで更新完了。早速ログインしてみたら、なぜかNFSが動かない。手動で追加してみても、名前解決できなくてダメ。IPアドレスで指定したらOKでした。これはおかしいと思って色々調べると、
$ ypcat hosts No such map hosts.byname. Reason: Can't bind to server which serves this domain
と出た。どうやらNISが動いてない感じ。それで名前解決できてない。結構調べましたが、どうやらubuntu16.04では、boot時にrpc.bindが動かないとのこと。それで、
# systemctl add-wants multi-user.target rpcbind.service
として再起動すればOKです。これすると、boot時に実行するようにリンクを張ってくれます。
https://qiita.com/hdoi/items/9cff4f840939636df807
見ました。ありがとうございました。
宝くじ
今年も外れたので、お金が無い。どうにか別のところで当てないと。
新しいPC(GTX1080Ti)が来た
研究費で新しいビデオカードを積んだPCを買った。これまでGTX1080,GTX1070,GTX760があるけど、もっと早いのが欲しくて、買っちゃいました。もうお金ない。まだ箱を開けてないので、そのうちやります。
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