2016/04/30(土)ubuntu 16.04インストール(10) IntlabとBLAS
Intlabは、INTLAB version 9をubuntu上のoctaveで使うの記事の通りで大丈夫です。
numpy, octave, Intlabなどは、高速なBLASが無いと本来の性能を発揮できないので、BLASを入れます。こちらも大体ubuntu 14.04でBLASを使うの記事と同じです。
sudo apt install libatlas-base-dev sudo apt install libatlas-doc sudo apt install libopenblas-base (既に入っていた) sudo apt install libopenblas-devこの時点で有効になっているライブラリを見ると、
$ sudo update-alternatives --config libblas.so.3 alternative libblas.so.3 (/usr/lib/libblas.so.3 を提供) には 3 個の選択肢があります。 選択肢 パス 優先度 状態 ------------------------------------------------------------ * 0 /usr/lib/openblas-base/libblas.so.3 40 自動モード 1 /usr/lib/atlas-base/atlas/libblas.so.3 35 手動モード 2 /usr/lib/libblas/libblas.so.3 10 手動モード 3 /usr/lib/openblas-base/libblas.so.3 40 手動モード 現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください: $ sudo update-alternatives --config liblapack.so.3 alternative liblapack.so.3 (/usr/lib/liblapack.so.3 を提供) には 3 個の選択肢があります。 選択肢 パス 優先度 状態 ------------------------------------------------------------ * 0 /usr/lib/openblas-base/liblapack.so.3 40 自動モード 1 /usr/lib/atlas-base/atlas/liblapack.so.3 35 手動モード 2 /usr/lib/lapack/liblapack.so.3 10 手動モード 3 /usr/lib/openblas-base/liblapack.so.3 40 手動モード 現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください:のような感じでした。14.04のときと違って、openblas版のlapackが入るようになってそれが有効になっていました。
更に、octave+openblas+intlabで丸め変更を検証の記事と同様に丸めの向きが正しく変わっているか検証すると、やはりマルチコアでopenblasは丸めの向きが変わりませんでした。そこで、先の記事と同様にopenblasを作り直します。
やり方は先の記事とほとんど同じですが、ひとつだけ注意点があって、Ubuntu 16.04 LTSをインストールする - Narrow Escapeの記事にあるように、16.04ではデフォルトでaptでパッケージのソースが落とせないようになっています。記事にあるように、
/etc/apt/sources.listでコメントアウトされているdeb-srcをコメントアウトを外す。 sudo apt updateを実行し、パッケージのソースを落とせるようにします。
後は14.04のときとほとんど同じです。
apt source openblas sudo apt build-dep openblas (必要なものを入れる。liblapack-picが入った) cd openblas-0.2.18/Makefile.ruleを編集し、コメントアウトされている
CONSISTENT_FPCSR = 1を有効化する。
dch -i で、version番号を進め、changelogを書く。 dpkg-buildpackage -b -uc -us cd .. sudo dpkg -i libopenblas-base_0.2.18-1ubuntu2_amd64.deb sudo dpkg -i libopenblas-dev_0.2.18-1ubuntu2_amd64.debこれで、マルチコアでもきちんと丸めの向きが変わるようになりました。
2015/06/28(日)octave+openblas+intlabで丸め変更を検証
行列積はn3回の乗算とn2(n-1)回の加算を含んでいますが、これらの全ての演算について、上向き丸めと下向き丸めで結果が異なる筈であるような入力値を与え、計算結果が同一になる(すなわち丸め変更が効いていない)ことが発生することがないかどうか試すプログラムを作ってみました。matlabのプログラムは書いたことがないのでこれが普通の書き方かどうかはよく分かりません。
function testmm(n) disp('testing multiplication...') flag = 1; for k=1:n a=zeros(n); a(:,k)=ones(n,1)*1/3; b=zeros(n); b(k,:)=ones(1,n)*1/3; c = (rad(intval(a) * b) ~= 0) + 0.0; if prod(prod(c)) == 0 disp('multiplication error!') flag = 0; break end end if flag == 1 disp('multiplication OK!') end disp('testing addition...') flag = 1; for k=2:n a=zeros(n); a(:,1)=ones(n,1); a(:,k)=ones(n,1)*2^(-27); b=zeros(n); b(1,:)=ones(1,n); b(k,:)=ones(1,n)*2^(-27); c = (rad(intval(a) * b) ~= 0) + 0.0; if prod(prod(c)) == 0 disp('addition error!') flag = 0; break end end if flag == 1 disp('addition OK!') end endこれをtestmm.mという名前で作成し、testmm(100)などとintlab上で実行してみました。なお、数値は行列サイズで、このプログラムはn4に比例した時間がかかるのであまり大きな行列ではテストできません。実行結果は、次のようになりました。
ubuntu 14.04 | windows + octave 3.8.2 | windows + octave 4.0.0 | |
---|---|---|---|
シングルコア | OK | OK | OK |
マルチコア | NG | OK | NG |
ubuntu 14.04 | 前記事で書いたubuntu 14.04 + パッケージで入れたoctave, openblas |
---|---|
windows + octave 3.8.2 | windows7 + INTLAB公式のoctaveページからダウンロードしたoctave 3.8.2 |
windows + octave 4.0.0 | windows7 + Octave公式ページからダウンロードしたoctave 4.0.0 |
# CONSISTENT_FPCSR = 1という行があります。これは、マルチスレッド環境において浮動小数点数のControl/Statusレジスタをコピーするか否かを決めていて、ここをuncommentするとopenblasが起動されたときの丸めの向きの状態がマルチスレッド時の全てのスレッドに伝わるようになります。この結果から、ubuntuのパッケージとoctave公式のopenblasはここがコメントのままmakeされていて、INTLABページのものはここのコメントが外されてmakeされていると推定できます。
ここからは、ubuntu 14.04の場合について、openblasのパッケージを作りなおしてマルチコア環境でも丸めの向きの変更が全てのスレッドに伝わるようにします。野良ビルドでも良いのですが、ubuntuのパッケージシステムとなるべく合わせた形で作ってみました。
- sudo apt-get install devscripts
- 適当な作業directoryを作ってそこに移動
- sudo apt-get source openblas でソースコードを取得。
- sudo apt-get build-dep openblas でmakeするのに必要なものをインストール。
- cd openblas-0.2.8/ でソースdirectoryに入る。
- Makefile.ruleを編集し、コメントアウトされている
CONSISTENT_FPCSR = 1
を有効化する。 - dch -i で、version番号を例えば0.2.8-6ubuntu2のように進め、changelogを適当に書く。
- dpkg-buildpackage -b -uc -us でmake。
- これで必要なdebファイルが生成されたので、cd .. で一つ上に上がり、
- sudo dpkg -i libopenblas-base_0.2.8-6ubuntu2_amd64.deb
- sudo dpkg -i libopenblas-dev_0.2.8-6ubuntu2_amd64.deb
ところで、INTLAB公式のoctaveページからダウンロードしたoctave-3.8.2-installer.exe、Aviraさんが
みたいに反応するんだが、大丈夫だろうか (自分は仮想環境で実行してすぐに消しました)。Aviraさんはときどき過剰に反応するからそのせいだと信じよう。