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