ページ

2016年5月6日金曜日

fortran 4倍精度で,計算速度はどの程度遅くなるか?

大学の環境で利用可能なコンパイラー
gfortran, ifort (intel), xl fortran (IBM), PGI fortran (NVIDIA)で
倍精度から4倍精度にした際にどの程度計算速度が遅くなるか比較する.
なお pgi fortranでは4倍精度のプログラムがコンパイルできなかったので,
実際には残りの3つの比較.

計算内容は割り算と掛け算をひたすら繰り返しただけ.

最適化(オプション)なしの比較.
----------------------- 結果1 (intel cpu)--------------------------------------

gfortran quadruple/double ratio
real: 9.6 倍遅延
complex : 19倍遅延

ifort quadruple/double ratio
real: 16倍 遅延
complex: 28倍遅延

efficiency (gfortran calc. time/ ifort calc. time)
gfortran -> ifort
real: 5.988sec/4.963sec -> 1.2倍 高速化
complex 22sec/16sec  ->1.3倍 高速化
(ifortの方がちょっとだけ早い)

--------------------------結果2 (ibm ワークステーション)------------------------

xlf90 quadruple/double ratio
real: 2.27倍遅延
complex: 5.83倍遅延

efficency  (gfortran -> xlf90)
gfortran 4.7.3で4倍精度コンパイルできなかったので比較できず.
(4.6から対応だと思っていたが・・・)

pgf90 4倍精度コンパイルできず...

-----------------------------------------------------------------------------
上記比較はオプションなしの場合.

ifortは倍精度は2-3倍オプションなしで早くなるが,
4倍精度では思ったより実力を発揮しなかった.
恐らく4倍精度はソフトウェア上での実装なので,最適化があまり意味がないのかと思う.
ただし,ifortの場合do文を自動並列化ができるので強制的に並列化してやれば,最大でcpu(thread)数倍くらい早くならないこともない.


ibmのコンパイラーはibmのマシーンに特化してる気もする.
他にもNAGや富士通(販売終了),absoftがあるらしいが,使ったこと無い.

価格2016年5月時点
IBM: $3380 
NAG: (63,000円) single user license 
Intel: 10-30万くらい (Parallel Studio XE Composer Edition)
PGI:5-10万くらい
absoft:6万-12万 
備考:intel compiler の非商用版(linuxのみ)は無償だったが,有償版だけになった模様.
学生に限りは無償使用のライセンスが在る模様.

2016年1月24日日曜日

Mathematica ベンチマーク @ Raspberry pi 2

Raspberry pi 2 を買ったのでMathematica(無償)のベンチマークを測ってみる。
mathematicaはnoobs から rasbian (jessei) installでデフォルトで導入されていた。


--------------- 参考 (手元のノート core-i7)-----------------------

In[1]:= Needs["Benchmarking`"]

In[2]:= Timing@Benchmark[]

Out[2]= {14.596, InputForm[{
  "MachineName" -> "----", "System" -> "Linux x86 (64-bit)", 
   "BenchmarkName" -> "WolframMark", "FullVersionNumber" -> "10.0.0", 
   "Date" -> "January 24, 2016", "BenchmarkResult" -> 1.197, 
   "TotalTime" -> 11.567, 
   "Results" -> {{"Data Fitting", 0.629}, {"Digits of Pi", 0.536}, {
     "Discrete Fourier Transform", 0.728}, {
     "Eigenvalues of a Matrix", 0.935}, {
     "Elementary Functions", 0.774}, {"Gamma Function", 0.456}, {
     "Large Integer Multiplication", 0.46}, {
     "Matrix Arithmetic", 0.416}, {"Matrix Multiplication", 0.983}, {
     "Matrix Transpose", 1.468}, {"Numerical Integration", 0.62}, {
     "Polynomial Expansion", 0.092}, {"Random Number Sort", 1.104}, {
     "Singular Value Decomposition", 1.268}, {
     "Solving a Linear System", 1.098}}}]}



-------------- Raspberry pi 2 (オーバクロック無し) ----------------------

In[1]:= Needs["Benchmarking`"]

In[2]:= Timing@Benchmark[]

Out[2]= {551.620000, InputForm[{
  "MachineName" -> "----", "System" -> "Linux ARM (32-bit)",
   "BenchmarkName" -> "WolframMark", "FullVersionNumber" -> "10.0.2",
   "Date" -> "January 24, 2016", "BenchmarkResult" -> 0.029,
   "TotalTime" -> 475.891,
   "Results" -> {{"Data Fitting", 10.904}, {"Digits of Pi", 4.805}, {
     "Discrete Fourier Transform", 30.977}, {
     "Eigenvalues of a Matrix", 35.914}, {
     "Elementary Functions", 25.479}, {"Gamma Function", 6.437}, {
     "Large Integer Multiplication", 6.735}, {
     "Matrix Arithmetic", 6.07}, {"Matrix Multiplication", 151.389}, {
     "Matrix Transpose", 7.202}, {"Numerical Integration", 11.684}, {
     "Polynomial Expansion", 1.086}, {"Random Number Sort", 8.376}, {
     "Singular Value Decomposition", 75.031}, {
     "Solving a Linear System", 93.802}}}]}


線形代数の差がすごいな。topで観察する限りElementary Functions の計算でcpu使用率が400%になる。

Raspberry pi 2 は4コアなので、フル性能使えているんだと思うけど、並列計算用karnelの起動できない。(LaunchKarnels[]の実行結果が空)
(ParallelDoかなんか実行た際に並列計算用のパッケージ?みたいなのをダウンロード後使えるようになった)

一方面白いことに、有料版Mathematicaはライセンスの制約上フロントエンドカーネルは2つまで(mathematicaを独立に2つまで)しか起動できないが、
Raspberry pi の場合はその制限が無いようだ。

他に気づいたことは環境設定が無いといこと、MathematicaScript、MatheKarnelが無いこと・・・(残念)

追記:代わりにwolframというコマンドがあるっぽい

Raspberry 版のMathematicaは何かしら機能制限がありそうだと思ってはいたけどちゃんと確かめてなかったので他にも制約がありそうです。
本当はラズパイ並列して、mathematicaタスク分散とか・・・、もう少し遊べそうかと思ったけど無理そうだな。

まー遊び道具としてもうちょっといじってみるか。

速度の問題はあるけど5000円程度でmathematicaが使えると思うと非常に安いのでは?
Mathematicaは日本人特別価格の設定でHome edition で7万くらい(日本以外は$300,日本から海外版購入不可)だからね.

-----------
raspberry piを安価pcとして使用した際に気づいたこと。

microsdの相性の問題で起動しなかったので、調べて買うこと。
wikiにまとまっているのでそれを買えば問題ないはず。


os がarmなのでubuntuのようにパッケージが豊富でないこと

例えばfirefox、やchromeがaptになく代わりにiceweaseelやmidoriがある。

chromium-browserは一つ前のversionのosではあったようだけど、最新版ではaptに無いため、debを拾ってきて インストールする必要がある。
Adobe flashが無いので困る人には困るかもしれない。

操作性は思ったより遅くはないけど機敏ではないかな
(El captanよりは応答が良いと思うのは私だけだろうか)
動画を見るのは結構大変かも?
オーバクロックのturboモードはめちゃくちゃ不安定だったけどpi2は割と安定してそう。

2015年6月4日木曜日

LaTeXでpdf画像が出力されない場合

日本語LaTeX (platex + dvipdfmx) 環境でpdf画像を\includegraphicsする際に,画像が出力されない場合があって困っていた.
具体的にはdviでは画像が出力されdvi -> pdfに変換後見えなくなる.

数年前に同じ経験をしていたのだが,解決方策を完全に忘れていたので,備忘録として残す.

私の環境下での解決方策は単純でpdfのversionが1-5だとdvi -> pdfに変換した際に画像が出力されなくなる.適当なテキストエディタ(emacsとか)でpdfの1行目にあるversionの情報
%pdf-1.5

%pdf-1.4
に書き直すだけで問題が解決された.副作用があるかどうかは知らない.

個人的な疑問だが,epsは原理的にテキストエディタで編集可能である事は知っていた.
その為nkf -g で文字コードを調べるとASKIIと帰ってくる.
しかしpdfはnkf -g で文字コードを調べるとBINARYである.
BINARYファイルを普通のテキストエディタで編集しても良いのだろうか?




Blog書くのひさしぶりだから(?),単文でも時間がかかるなぁ・・・.



2014年5月27日火曜日

MathemathicaScript の引数

MathematicaScriptの引数の引き渡しをいつも忘れてしまうので覚え書き.

MathematicaScriptの引数は

 $ScriptCommandLine
渡され,一番目はScriptのファイル名,2番目から引数となる.引数の制御は

If [Length[$ScriptCommandLine] !=2, 
 Print["usage: MathematicaScript -script" <> $ScriptCommandLine[[1]] <> " value1"];
 Exit[1] ]

とでもしておけば良い.引数はstringで受け取るので,実数とかにしたければ
ToExpression@$ScriptCommandLine[[2]]

とでもすればよい.

2014年4月29日火曜日

home page

home pageのコンテンツを一次非公開にしました.理由は内容が微妙だから.
また記事がまとまったら公開するかもしれません.

2014年1月22日水曜日

Mavericksのメモリー圧縮機能について

Mac OSX 10.9.1 (Mavericks) でカーネルパニックが発生したので記録する.

1.環境と問題

iMac
21.5-inch, Late 2013
プロセッサ  3.1 GHz Intel Core i7
メモリ  16 GB 1600 MHz DDR3


で数値計算を行った.メモリー使用量は

数百MB程度のメモリーを使用×6 + (瞬間的に)1GB程度メモリーを使用=最大で2GB程度

マシン性能から考えて余裕だろうとたかをくくっていたが,
結局2度強制終了するはめになった.

2. 現象

* 一定時間経過後,スワップアウトし始める
* CPUの使用率が100%にならない(10%)程度
* 最終的に応答不能状態に陥る->強制終了
アクティビティーモニターのメモリー観察
* kernel_task が10GB程度メモリーを占拠(何もしない状況では800MB程度)
* メモリー圧縮が8GB程度
* メモリープレッシャーが増大しつづける.






Mavericksから導入されたCompressed memory機能が怪しい!

3.解決

以下自己責任で
Disable compressed memory in Mac OS 10.9 Mavericks?
を参考にターミナルでメモリー圧縮modeを確認する(defaultは4)

$ sysctl -a vm.compressor_mode
vm.compressor_mode: 4

1でメモリー圧縮機能を切れるらしいので

$ sudo nvram boot-args="vm_compressor=1"

にして,再起動(なぜか再起動後も4だったので2回もやってしまった・・・)

$ sysctl -a vm.compressor_mode
vm.compressor_mode: 1

で vm.compressor_mode: 1 となっている事を確認する.

今のところ再度同じ計算をさせてみると,メモリープレッシャーも起こらないし,
kernel_taskがメモリーを馬鹿食いする事もなくなった.

メモリープレッシャーはマシン性能が悪い場合に威力を発揮するらしいが,
数値計算する上では邪魔な機能だなと思いました.

 おまけ

今まで知らなかったのだがターミナルで

$ sudo purge

を実行するとファイルキャッシュがクリアされる.

なんでも,duを行ってもファイルキャッシュが一掃されるらしいのだが,
効果は不明だし時間がかかるのでpurgeで十分な気がする
(少なくともmavericksでは).

2013年12月1日日曜日

Mathmaticaを用いた数値対角化の計算時間

Mathematicaを用いた対角化の計算速度をplotしてみました.

対角化した行列のclassは
ランダムではなくスパーズではない一般のエルミート行列(赤ドット)と
ランダムではなくスパースではない一般のユニタリー行列(青ドット).
また,行列は200桁精度で近似評価されています.

厳密評価のまま計算するとキットモット遅い.

行列の構成方法は気にしないと言う事でご勘弁.

実線は計算時間を3次の多項式でfittingしたもの.
最後に描画とfittingのプログラムを置いときます.
(もちろん計算時間のデータファイルがないと動きませんが・・・
欲しいなら上げますが,欲しいか?)




import numpy as np
import matplotlib.pyplot as plt

def f(x,para):
    return para[0]*x**3 + para[1]*x**2 + para[2]*x + para[3]
    
data = np.loadtxt("time_prec200.dat").transpose()
fig = plt.figure(figsize=(8,4))
ax0 = fig.add_subplot(1,2,1)
ax1 = fig.add_subplot(1,2,2)
colors=["red", "blue"]
for i, ax in enumerate([ax0,ax1]):
    ax.plot(data[0],data[1]/3600,'o', label='Hermitian matrix',markersize=10, color=colors[0])
    ax.plot(data[0],data[2]/3600,'o', label='Unitary matrix',markersize=10,color=colors[1])
#    ax.plot(data[0],data[3]/3600,'og')
    for j in range(1,3):
        x = np.arange(100, 10000,1)    
        para = np.polyfit(data[0],data[j],3)
        y = f(x,para)
        ax.plot(x,y/3600,'-',linewidth=3,color=colors[j-1])
    if i==1:
        ax.loglog()
        ax.set_xlim(50,10000)
    else:
        ax.set_ylim(0,5)
        ax.set_xlim(0,1000)
        ax.set_ylabel("calculation time (hours)",fontsize=16)            
    le = ax.legend(loc=2,numpoints=1)
    le.draw_frame(False)
    ax.grid()
    ax.set_xlabel("matrix dimension",fontsize=16)
sup = plt.suptitle("diagonalization time with Mathematica (precision=200)",fontsize=15)
sup.set_position((0.5,1.0))
plt.tight_layout()
plt.savefig("calc_time.png")
plt.show()