2011年8月27日土曜日

8/26 OpenCL IKA-SST

U君に監修してもらったお陰でIKA-SSTのOpenCL移植版がコンパイルまでは通った。
一通りコードは移植したのだが、最後の行列演算でエラーが出る。
今後はこれがうまく動くようデバッグを行う。
OpenCLに移植した際に幾つか怪しい部分があるので、まずはそこをチェックする。
締切も迫っているので急がなくては。

2011年8月24日水曜日

8/24 AMD APP SDK v2.5

いつの間にか2.5が出ているようだが全然気づかなかった。

何が新しくなったのか見てみたのだが・・・

・Kernel launch times have been further reduced.
信じていいのだろうか。今更インストールする時間があるか微妙だが。

・For APUs, zero copy buffers created as CL_MEM_ALLOC_HOST_PTR | CL_MEM_READ_ONLY offer improved GPU read performance.
そもそもLinuxでzero copyは対応していない。残念。

2011年8月23日火曜日

8/23 苦戦中

IKA-SST GPU版をCUDAからOpenCLへ移植中。
OpenCLデバイスの初期設定やメモリ確保、CPU計算部分はたぶんうまく移植できた。
あとは本丸のGPUでの計算部分が動ければよい。

GPUカーネルコード部分が問題なのだが、初っ端から躓いてしまった。
OpenCLのデバイス側の制約などがまだちゃんと頭に入っておらず、
検索に時間を取られすぎてしまって全然進展しない。

締切も迫っているのでこのままではまずい。

2011年8月22日月曜日

8/22 gcc

IKA-SSTの実装で使っているライブラリはcblasとlapackだが、
ライブラリをリンクする場合には依存関係による順番に注意が必要らしい。

cblasはatlasとf77blasに依存しており、f77blasはgfortranに依存、
lapackはatlasに依存している。

これを踏まえてgcc(g++)に渡すオプションを整理すると、
-lcblas -lapack -latlas -lg77blas -lg77fortran
のような感じになる。
ダイナミックリンクライブラリだと関係ないらしい。

難しい。

8/22 IKA-SST on CPU

U君に手伝ってもらい、IKA-SSTのCPU版のコンパイルが通った。
一応コンパイル時のオプションを記述しておく。
g++ Main.cpp sst.cpp -I/usr/global/boost/include -I"/usr/global/cuda/include" -I"/nfs/home/matsuura/ikaSST/sst_CPU/inc" -O3 -fno-strict-aliasing -msse -msse2 -Wall -L/usr/global/boost/stage/lib -L/usr/global/centos5.4/lib64 -L/nfs/home/ueno/lib -lboost_thread -lgfortran -llapack -lf77blas -lcblas -latlas
環境依存なので他所では役に立たないし、そもそもIKA-SST自体がローカルのコードだが。

CentOS環境下ではうまく動作するが、Scientific Linuxではうまくいかない。
Fortran関連のライブラリがうまくいってない模様。
./a.out: error while loading shared libraries: libgfortran.so.1: cannot open shared object file: No such file or directory


###追記

共有領域にlibが置いてあったようなので、それを/etc/ld/so.confに追加し、
ldconfigしたら無事に動いた。

Phenom 2.5GHzとE-350 1.6GHzなので実行時間は4倍くらいかかってしまうが、
APUとの比較なのでまあ大丈夫だろう。

ようやくAPUへのポーティングにとりかかれるが、困難を極めると予想される。

2011年8月12日金曜日

8/12

実験データをNFSから写し忘れてしまい、作業が全くできない。
図書館のサイトは復活したので停電は終わったはずだが、
なぜか研究室のSSHは全く無反応のままだ。
15日まで作業できないのだろうか。

2011年8月10日水曜日

8/9 OpenCL VWAP on Linux

だいぶ前に作成したVWAPをLinuxで実行。
ソースは時間測定部分が変わるだけで全て同じ。
10回実行の上下特異点を抜いて8回の平均値を算出。
10000回実行時のメモリ送信、カーネル実行、メモリ受信のそれぞれの時間を測定。

現在VOIDとVWAPをCPU、APUそれぞれで実行中。
結果が出たらWindows版と比較する。

ちらっと結果を見たところ、メモリ送信は10倍近く時間がかかっている。
初回起動時のオーバーヘッドかと思ったが、10000回のそれぞれがj10倍程度遅い。
実はWindows版はゼロコピーらしきものが効いていたのだろうか?

カーネル実行時間は数%程度は下がっている。
しかし大勢には影響ない・・・。

詳しい集計や考察はまた明日以降に。

2011年8月8日月曜日

8/8 Scientific Linux

インストールはCentOS 6.0とほぼ同様。
パッケージはDesktopのみを選択。
リポジトリはAMD64とセキュリティも追加。

・System S
必要なパッケージを適当にyum。
おととい書いたものは重複やエラーも混じっていたので修正。

# yum install -y gcc libstdc++-devel gcc-c++ boost-devel libicu-devel zlib-devel libxml2-devel binutils-devel libsepol-devel keyutils-libs-devel e2fsprogs-devel krb5-devel openssl-devel libidn-devel perl-Digest-SHA1 perl-XML-Parser perl-XML-Simple curl-devel libstdc++.so.5 perl-libwww-perl.noarch compat-libstdc++-33 perl-XML-SAX libicu-devel libxml2-devel binutils-devel libXaw compat-expat1 libperl.so

しかしこれでもgraphvizはインストールできないし、
スクリプト起動時のエラーも消えない。
具体的にはlibltdl.so.3とlibperl.soが解決できない。
yumではインストールできているようだが、System Sが要求しているものと微妙に違うようだ。
これに対処している暇は今はないので、System SはRedhat/CentOSの5.xで使うしかなさそうだ。


・OpenCL
今までと同様。
# wget http://www2.ati.com/drivers/linux/ati-driver-installer-11-7-x86.x86_64.run
# yum install kernel-devel rpm-build

runlevelを3にしてスクリプトを起動してRHEL6 AMD64のドライバを生成。
生成が成功したらyumでインストール。
rpmのインストールでもyumを使うほうがいいらしい。

# aticonfig --initial -f
してからまたrunlevelを5に戻して再起動。

このままではうまくいかなかったが、/etc/OpenCL/vendors/以下を追加したら成功した。
追加するファイルの詳細はこの前このブログにも書いたので省略。

ここまでやると、OpenCLデバイスでGPUも認識され、
サンプルコードを動かしてもGPUで実行されることが確認できた。
atigetsystemlog.shでも以前うまくいっていなかった部分が更新されている。

System Sは残念だったが、OpenCLは無事動いた。
これで安心して帰省することができそうだ。


・おまけ
サンプルコードのGlobalMemoryBandwidthの実行結果

実行環境
[OS] Scientific Linux 6.1
[APU] AMD E-350
[RAM] DDR3 2GB (512MB for Graphics)
[M/B] E35M1-I
[Software] AMD APP SDK v2.4, Catalyst 11.7, gcc 4.4.5


Selected Platform Vendor : Advanced Micro Devices, Inc.
Device 0 : Loveland
Build Options are : -D DATATYPE=float4

Global Memory Read
AccessType : single
VectorElements : 4
Bandwidth : 31.4677 GB/s

Global Memory Read
AccessType : linear
VectorElements : 4
Bandwidth : 17.9922 GB/s

Global Memory Read
AccessType : linear(uncached)
VectorElements : 4
Bandwidth : 15.332 GB/s

Global Memory Write
AccessType : linear
VectorElements : 4
Bandwidth : 21.1874 GB/s


色々CPUとの性能差があって面白い。

2011年8月7日日曜日

8/6 CentOS 6.0許すべからず

6だとインストーラが色々変わっていてややこしかった。
テキストインストーラの指定方法を調べるのが面倒でGUIでやったが失敗だった。
やはりGUIインストーラはいらない。

・CentOS 6.0でSystem S
デスクトップのパッケージのみを選択した場合、yumするやつが余分に必要。
yum install -y boost gcc libstdc++-devel gcc-c++ boost-devel libicu-devel zlib-devel libxml2-devel binutils-devel libsepol-devel keyutils-libs-devel e2fsprogs-devel krb5-devel openssl-devel libidn-devel perl-Digest-SHA1 perl-XML-Parser perl-XML-Simple curl-devel libstdc++.so.5 perl-libwww-perl.noarch compat-libstdc++-33 libltdl.so.3
yum install -y libtool-ltdl perl-Digest-SHA1 perl-XML-Simple perl-XML-SAX gcc-c++ boost-devel libicu-devel libxml2-devel binutils-devel curl-devel libltdl.so.3
yum install libXaw
yum install compat-expat1
yum install libstdc++.so.5
yum install libperl.so
(複数のスクリプトからのコピペなので重複があります)

しかしlibltdl.so.3はlibtool-ltdlがあるにも関わらず解決しない。
graphvizがインストールできないが、無視した。

libperl.soがないとか怒られてデーモンが起動できない。
さすがに眠いので今日はここまで。


・atiのドライバ
# yum install kernel-devel rpm-build
して前のドライバをDLして実行。
GenerationでRHEL6のAMD64を選んで生成。
これで後は生成されたRPMをインストールするだけ。

しかしインストールされているはずのライブラリがないとか言い出す。
さすがにキれた。System Sも動かんし。
CentOS6はRHクローンを名乗るに値しないのではないか。
許し難いのでScientific Linuxに鞍替えすることを決定。

もうダメだ。9月初旬に間に合う気がしない。
眠すぎるしやる気がゼロ。明日の晩また頑張る。

2011年8月6日土曜日

8/6

Forumに別のポストがあったので試してみる。

/etc/inittabでRunlevelを3から5に変えるといいようだ。
あと、
# aticonfig --adapter=all --initial
も必要?
これはマルチカードのときのみかもしれない。


しかしダメだった。
atigetlogみたいな感じのコマンドでログを見てみると、
どうやらカーネルソースが古すぎてカーネルモジュールの作成に失敗している。
これが原因か。

CentOS 6をまずは試してみるか・・・。

2011年8月5日金曜日

8/5

色々手を尽くしたつもりだが、結果は散々だ。
Linuxの管理運営はここ数年でかなり習得できたつもりだっだが、
Xには手も足も出ず、認識の甘さを思い知らされた。

このままCentOSに固執するのは愚行のような気がしてきた。
フォーラムなどを見ても他のOSの例しかない。
CentOSも5.6ではなく6にするか、debian, ubuntu,
RHEL, Scientific Linux, Gentooあたりに逃げるかもしれない。

とりあえずisoは落としたので、色々検討してみる予定。

2011年8月3日水曜日

8/3 実はまだ動いていなかった

昨日からの続き。
どうも標準のXorgのやつだとうまくいかない。
もう一度ドライバを生成してみる。

最初に前のドライバを消すのも大事。
# /usr/share/ati/amd-uninstall.sh

カーネルソースがなかったのが原因の一つのようなので、
# yum install kernel-devel
そりゃ失敗するわけだ。

前と同じようにやると、fglrx64_p_i_c-8.872-1.x86_64.rpmや
fglrx_p_i_c-8.872-1.i386.rpmやicd-registration.tgzが生成される。
icd-registration.tgzはここで生成されるのか・・・。

普通に
# rpm -ivh fglrx64_p_i_c-8.872-1.x86_64.rpm
してやる。

初期化。
# aticonfig --initial -f

実機でstartxしてドライバをfglrxにする。


しかしやっぱりうまくいかない・・・。
このままではヤバイ。

2011年8月1日月曜日

8/1 Linux + OpenCLの続き 作業ログ

うまくいったような気がしたが、それは嘘だった。
サンプルプログラムのコンパイルは成功しているが、実行ができない。

例)
# cd /usr/global/AMD-APP-SDK-v2.4-lnx64/samples/opencl/bin/x86_64/
# ./HelloCL
HelloCL!
Getting Platform Information
Platform::get() failed (-1001)

エラーです。お疲れ様です。


色々原因を探ってみる。
aticonfigとかamdcccleなど、AMDのドライバ系のツールがある。

# aticonfig --lsa
* 0. 00:01.0 AMD Radeon HD 6300 series Graphics

* - Default adapter

と、なるのでとりあえずAPUは認識されている。
VNC経由で、
# aticonfig --initial
として初期化もやってみる。

しかしうまくいかない。

# amdcccle
は壮大なエラーを吐いて停止する。
何か、AMDのGPUドライバが入ってないとか言われる。マジか。
もう一度インストールしてみた。
その前にrpm-buildもyum installしておく。
(一回これがないためにドライバのビルドが失敗しているよう)

# ./ati-driver-installer-11-7-x86.x86_64.run
今度は「Generate Distribution Specific Driver Package」してみた。
CentOS 5.6 AMD64なので、「RedHat/RHEL5_64a」と「RedHat/RHEL5」を選択。

インストールは成功したが、うまくいかない。
さらに調べたが、/etc/OpenCL/vendorsが悪いみたい。
これがATI系の名前のままだと失敗する。

中身を見るとただのテキストファイルなので、自分で書いたほうがよさそう。

/etc/OpenCL/vendors/amdocl32.icd
中身↓
libamdocl32.so

/etc/OpenCL/vendors/amdocl64.icd
中身↓
libamdocl64.so

こんなやつを作ればOK。
パーミッションはリードオンリーでOK。

ようやく動いた。
たぶんドライバは関係ない。
vendorsが悪い。


ここまで到着するのに3時間くらい消費した。
疲れた。肉食いたい。


成功パターンも一応記載してみる。
# ./HelloCL
HelloCL!
Getting Platform Information
Creating a context AMD platform
Getting device info
Loading and compiling CL source
Running CL program
Done
Passed!

8/1 中間発表終了 & Linux + OpenCL

中間発表が完了。
スライドをしっかり見ていただいていたお陰で、特にハプニングもなく坦々と終わった。
観客が他の研究室の先生お一人と学生一人だったのもあるが・・・。
一箇所、APUがCPUとGPUのギャップを埋めるデバイスであることを述べ忘れたが、
先生にフォローしていただいたので一応大丈夫だった。


次の実装に向けて環境をLinuxに移行する。
既存のコードがLinux + System S用だと
M研究室のNさんにアドバイスをいただいたのもある。

CnetOS 5.6にAMD APUドライバとAMD APP SDK(OepnCL 1.1)を導入する。


以下作業ログ。
・ドライバインストール
# wget http://www2.ati.com/drivers/linux/ati-driver-installer-11-7-x86.x86_64.run
# ./ati-driver-installer-11-7-x86.x86_64.run
(Xは提示されたX.ORG6.9を普通に選択。全部一番の選択肢でOK)

・SDKインストール
# yum install mesa-libGLU-devel.x86_64
(/usr\include/GL以下のglu.hやgl.hのために必要。もしかしたら他のでもいいかも。)

・icd-registration.tgz
これも必要な模様。AMD APP SDKの過去のアーカイブからゲット。
リンクが深いので注意。

# wget http://download2-developer.amd.com/amd/Stream20GA/icd-registration.tgz
# tar zxvf icd-registration.tgz -C /

インクルードパスなどを.bashrcに追加してsourceする。
export AMDAPPSDKROOT=/root/AMD-APP-SDK-v2.4-lnx64
export AMDAPPSDKSAMPLESROOT=/root/AMD-APP-SDK-v2.4-lnx64/samples
export ATISTREAMSDKROOT=$AMDAPPSDKROOT
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$AMDAPPSDKROOT/lib/x86_64
export LIBRARY_PATH=$LIBRARY_PATH:$AMDAPPSDKROOT/lib/x86_64
export C_INCLUDE_PATH=$C_INCLUDE_PATH:$AMDAPPSDKROOT/include/

# wget http://download2-developer.amd.com/amd/APPSDK/AMD-APP-SDK-v2.4-lnx64.tgz
# tar zxvf AMD-APP-SDK-v2.4-lnx64.tgz
# cd AMD-APP-SDK-v2.4-lnx64
# make

最後にディレクトリ全体を/usr/globalに移動させ、パスなどを書き換えて終了。
これでOpenCL実行・開発環境が完成。

最終的な.bashrcの追加内容は以下の通り。
export AMDAPPSDKROOT=/usr/global/AMD-APP-SDK-v2.4-lnx64
export AMDAPPSDKSAMPLESROOT=$AMDAPPSDKROOT/samples
export ATISTREAMSDKROOT=$AMDAPPSDKROOT

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$AMDAPPSDKROOT/lib/x86_64
export LIBRARY_PATH=$LIBRARY_PATH:$AMDAPPSDKROOT/lib/x86_64
export C_INCLUDE_PATH=$C_INCLUDE_PATH:$AMDAPPSDKROOT/include/



## 環境 ##
CentOS 5.6 AMD64
Catalyst 11.7
AMD APP SDK 2.4