HPCメモ

HPC(High Performance Computing)に関連したりしなかったりすることのメモ書き

zlib関連のメモ

zlib関連のlink集です。

配布元
zlib Home Site

ファイルフォーマットやアルゴリズムの解説など
RFC 1950 - ZLIB Compressed Data Format Specification version 3.3
RFC 1951 - DEFLATE Compressed Data Format Specification version 1.3
RFC 1952 - GZIP file format specification version 4.3

Deflate


使い方の解説
zlib Usage Example
zlib の使い方
zlib 入門


今のところ使い方の解説に上げた3サイトを見比べつつ、zlib.hを見るのが一番分かり易いです。

AWSその3

最初に、前々回の記事を2ヶ所訂正します。

無料枠ではEBSは30GB以下に制限されているので、とりあえず30GB付けておく

と書きましたが、後から減らすのは難しいので、SSDの下限である10GBか、CentOSのAMIで設定されている8GBのままで良かったかもしれません。
課金されるようになると、EBSにしろAMI(を置いているS3にしろ)1GB単位の単価なので。*1



もう一箇所はauthorized_keysを作成した後で

chmod 600 ~/.ssh/authorized_keys

するのを忘れてました。

今日別のマシンでやっていて、この作業を忘れてたんですが、クライアント側では(-vvvを付けても)原因を表示せずにパスワード認証に落ちるのでしばらくはまってましたorz
*2


さて、今日の作業はこちら
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/dynamic-dns.html
昔懐しのDDNSです。
といっても、これまたほぼamazonのドキュメントどおりですが・・・

まずは、epelを有効にしてnoipのパッケージをインストールします。

> su -
$ yum install epel-release
$ yum install noip

次にno-ipの設定ファイルを作成します。以下のコマンドを入力するとインタラクティブにアカウント名とかパスワードを聞いてくるので、入力してください。

$ noip2 -C

それから、noipのサービスを起動します。

$ service noip start

ちょっと待ってから、設定したホスト名でアクセスできることを確認してください。
最後に自動起動の設定です。

$ chkconfig noip on
$ chkconfig --list noip
noip 0:off 1:off 2:on 3:on 4:on 5:on 6:off


これで概ねsshでログインして遊ぶオモチャが完成です。

*1:とはいえS3だったら$0.03/GBとかいう値段ですが・・・

*2:サーバー側で/var/log/secureを見てたらauthorized_keysのパーミッションが×って出るんですけどね・・・

AWSその2

OSの設定(続き)

rpm -qa |wc -l すると 195行 とかいうコンパクトな構成なので、
とりあえず、片っぱしから使いそうなパッケージをインストールします。

yum install vim screen gcc gcc-c++ gcc-gfortran gdb wget git xeyes openmpi

とりあえずこれで普段使っているものは一通り入ったはず。*1
あとはpythonも欲しいとこだけど、標準だと2.6なんで2.7を/optの下にでも後で入れることにします。

ユーザ設定

この辺は人によって違うと思いますが、私の場合は

  1. sshの鍵ペア作成
  2. 公開鍵をgithubとbitbucketと某所と某所のFEPに登録
  3. bitbucketに置いてあるdot fileをclone

で完了です。

AMIの保存

せっかくの仮想環境なので、一通りの設定が終わったところでOSイメージを保存しておきましょう。
といっても、この項もほぼこのドキュメントに従って操作するだけなので、手順は省略します。
Amazon EBS-Backed Linux AMI の作成 - Amazon Elastic Compute Cloud

作成が完了したら、新しいAMIでインスタンスを立ち上げて、これまでの設定が残っているかどうか確認します。

最後に、元のインスタンスとEBSボリュームを削除して作業完了です。

*1:xeysは常用してるわけじゃなくて、Xのポートフォワードのテスト用に使うだけなわけですが

AWS

ずいぶん前にUdacityのparallel computing(という名のGPGPU)の授業でレポートを提出したら、AWSのクーポンをくれていたのを思いだして、インスタンスを作ってみました。

構成は、t2.microでCentOS6.5にして、片っ端から使いそうなパッケージを突っ込んだだけという、テキトーなものですが
後々の備忘のためにまとめときます。

インスタンスの作成

基本的にはこの動画の流れにそってやればOK
ご利用開始にあたって - Amazon EC2 (クラウド上の仮想サーバー Amazon Elastic Compute Cloud) | アマゾン ウェブ サービス(AWS 日本語)
ポイントは3つあって

  1. CentOS6のAMIがMarket placeに複数あって、その中でも"6 with updates"と書かれたものを選ぶこと*1
  2. AMIにはPV用とHVM用の両方があるけど、t2.microを使いたければHVM用を選ぶ必要がある
  3. 無料枠ではEBSは30GB以下に制限されているので、とりあえず30GB付けておく

OSの設定

インスタンス起動ウィザードの最後の方で作成した鍵ペアを使ってrootでログインします。
無事に入れたら、とりあえずrootのパスワードを設定しときましょう。

その後、一般ユーザでリモートログインできるように変更します。

> adduser hoge
> su hoge
> mkdir .ssh
> chmod 755
> vi .ssh/authorized_keys

として、普段つかっている公開鍵を放り込みましょう。

その後、作成した一般ユーザでログインできることを確認してからRootのリモートログインを不可にします。
/etc/ssh/sshd_confを編集して

PermitRootLogin no
PasswordAuthentication no

あたりを設定します。
PermitRootLoginに関しては、私が設定した時は通常のコメントアウトされた行がある位置から大きく離れて、ファイルの末尾近くに"PermitRootLogin without-pasword"という設定が書かれていたので注意してください。

ファイルの修正が終わったら、新しいターミナルを起動して接続し、前のターミナルは残したままの状態で

> service sshd restart

とします。*2
さらに別のターミナルからログインできることを確認したら、作業完了です。

最後に、OSを再起動しても正常にログインできるかどうか確認します。
これは、コンソールから

shutdown -r now

ではなく

マネジメントコンソールのダッシュボードから再起動したいインスタンス上で右クリック→"reboot"を選択

とします。


長くなってきたので、続きは後日

*1:"6.5 release"と書かれたものは、本当に6.5のリリース時のバージョンとのこと

*2:前職の先輩からは、restartの前後にps -ef |grep sshd してPIDが変わってることを確認するようにと厳しく言われてたけど、業務でやるわけじゃないのでパス:(

OpenMP+MPIハイブリッド実行 with OpenMPI

ひさびさにすっぽりとハマったのでメモ

OpenMPI 1.8.1な環境で、MPI/OpenMPのハイブリッド実行をしようとしてたのですが、

mpirun -np 1 ./a.out

とやるとOMP_NUM_THREADSの値に関わらず1coreしか使われないけど、mpirunを使わないで

./a.out

とすると、きっちりOMP_NUM_THREADSで指定したコア数まで使われるという謎の現象が起きてました。

結論を先に書くと、mpirunのオプション --bind-to を明示的に指定することでこの現象は解決します。

mpirun --bind-to board -np 1 ./a.out

みたいな感じで。



ちなみに、今回のテスト環境はシングルソケットのマシンだったのでboardを使ったけど、マルチソケットな環境であれば--bind-to socketを指定したうえで
プロセス数をsocket数(の倍数)にすることをお勧めします。*1

これはどういうことかというと、mpirun経由で実行した時は、デフォルト設定の"--bind-to core"の指定によって、生成されたプロセスとそこからfolkした子スレッド全てが同一コアに割り当てられてしまったために、何スレッド生成しようが1コアしか動かなかったんではないかと。


なんでこんなもんをデフォルトの挙動にしたのかと問い詰めたいとこですが、これやんないとflatMPIのプログラムをコアを余らせて実行した時に空いているコア間で
マイグレーションして、キャッシュミス頻発しちゃうという、嫌な状況になるので理解できなくはないです。

実際のところ、マイグレーションはされたくないけどどこのコアでも勝手に使ってくれて良いよというユーザの方が多いと思うので、デフォルトではpinning(一回使い始めたコアを使い続ける)は有効だけど、バインド(特定のRankを特定のコアに割り当てる)は無効になっているIntelMPIの方がありがたいなぁ。*2



OpenMPIの開発者の皆様には、夜中の1時にデバッガからomp_get_max_threads()した時の私の絶望を多少なりとも慮っていただきたいもんだ*3

*1:つーかnoneでも良いかも

*2:昔のIntelMPIはPinningも無効になっていて、それはそれでトラブったけど・・・

*3:ま、デバッグ中はいつものことだけど

python2.6@windows7 へ IPython を導入してみる

会社から支給されているお仕事PCには、某ソフトのインストール時に一緒に導入されたpython2.6が入ってるんですが、仕事の合間にちょろっと調査で使った時に


windowsコマンドプロンプトからコピペするのが激しく面倒


ということに今さらながら気付かされたので、IPythonを導入してみることにしました。

必要なツールの導入

パッケージによっては、Cコンパイラが必要になるため、VC++2008 expressを導入します。
インストーラはこちら
http://go.microsoft.com/?linkid=7729279

python2系列のwindows用バイナリはVS2008でビルドしているので、これより新しいバージョンでは不具合が起きるそうです。
参考URL: https://support.enthought.com/entries/26864394-Windows-Unable-to-find-vcvarsall-bat

実際に、最初はVS express 2013 for windows desktopを入れて試してたのですが、パッケージのビルドに失敗していました。

インストーラをダウンロードして起動したら後はお任せ設定で良いのでインストール方法自体は省略します。


VC++2008 expressには64bit用のコンパイラが含まれていないので、
Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1をダウンロードしてインストールします。
インストーラはこちら
http://www.microsoft.com/en-us/download/details.aspx?id=3138

こちらも同様にインストール方法自体は省略。
ただし、サンプルとかドキュメントが2GB近くあったので、不要であればインストール対象から外した方が良いかもしれません。
私は実際に外してインストールしましたが、特に問題は起きていないです。


それから、こちらのURLにある、インストラクションの1.6に従ってバッチファイルをコピーします。
http://blog.victorjabur.com/2011/06/05/compiling-python-2-7-modules-on-windows-32-and-64-using-msvc-2008-express/

このファイルを

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\vcvars64.bat

こっちへコピーしてさらにファイル名を変えます

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64\vcvarsamd64.bat

なお、さきほどのインストラクションではさらにmsvccompiler.pyへ修正をしていますが、私の環境では不要でした。

PATHの設定

環境変数のPATHに、(もし無ければ)以下の設定を追加します。

C:\Python26;C:\Python26\Scripts;C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC;

pipのインストール

python用のパッケージマネージャであるpipをインストールします。
公式webサイトにあるドキュメント(http://www.pip-installer.org/en/latest/installing.html)のとおり
get-pip.pyをダウンロードして、コマンドプロンプトから

> python get-pip.py

でインストール完了です。

ぐぐると、「setuptoolsを入れて easy_install pip する」という記事がみつかりますが
最近のバージョンはこれでOKだそうで。

ipythonのインストール

コマンドプロンプトから

>pip install ipython

これだけで本体はすんなりとインストールできます。

続けて、--pylabみたいな素敵な機能を使うためにパッケージを追加していきます。
といっても、基本的にpip installしてるだけですが。

>pip install pyzmq
>pip install jinja2
>pip install tornado
>pip install matplotlib

しかし、matplotlibのビルドはこんなエラーが出て失敗しました。

c:\users\(中略)\matplotlib\src\ft2font.h(16) : fatal error C1083: Cannot open include file: 'ft2build.h': No such file or directory

freetype2のヘッダが無いと言われてるので、入れればビルドできそうですが、matplotlib1.3.1はpython 2.6用のpre-buildパッケージがあるので、こっちを入れて回避します。
http://matplotlib.org/downloads.html

インストール完了後に、ンタラクティブシェルからimport matplotlibすると
dateutil, pyparsingが無いと言われるので、さらに追加インストールします。

>pip install python-dateutil
>pip install pyparsing

これで一応環境の構築は完了
あとはこんな感じのバッチファイルを用意して、ダブルクリックすれば、ブラウザ上になんか出てきます。

ipython notebook --pylab inline

これで、適当にインタラクティブで試したコードと結果をまとめて他の人にまる投げできるようなりました*1

最後に

pythonのバージョンに拘らなくても良いのであれば、IPythonの公式webにあるように

1. Download and install Anaconda or the free edition of Enthought Canopy.

ってのがお勧めです。

*1:投げる相手が入ればの話だけど・・・

cygwinのインストール

ここのとこteraterm+winscp+Xmingの代替として、MobaXtermってのを試してました。

ローカルでgccとかも実行できて便利そうだし、sshとsftpとXサーバを1アプリにまとめられるから、持ち歩きも簡単そうと思って期待してたんですが、
高負荷時にちょくちょく落ちたり(sftpでファイルサイズが大きいものを転送しようとするとsftpのタブが無くなったりとか)パッケージとしてインストールできるgccのバージョンが古かったりで、常用してるとストレスがたまってきます。

でも、元に戻るのも癪だったので、いっそのことと思ってcygwinを導入することにしました。*1

インストール方法は以前(10年くらい前か?)試した時とほとんど変わってなくて

  1. インストーラをダウンロード
  2. インストーラを起動
  3. 言われるがままに「次へ」を選択
  4. パッケージを選択
  5. インストール

といった流れです。
*2


インストールするパッケージは次のものを選びました。


とりあえず、これで手元でちょろっとテストコードをコンパイルすることもできるsshクライアント&Xサーバの完成です。
あとは、bitbucketに放り込んでいる、dot fileとかを取ってくればだいたい普段のLinux環境と同じ感覚で使えます。
*3




で、これインストール先にSkyDrive(現OneDrive)を選んだんですが、同期が終わるのはいつになるかな・・・

*1:pagentとか細かいのもイロイロ捨てれそうだし

*2:本当にcygwinのインストール方法を知りたい人はまっとうな解説記事を探してください :p

*3:tabを押してコマンドラインを補完した時にls.exeとか出てきて違和感があるのを除けば