mathlink_transfer

English version is here:mathlink transfer time

MathLinkの転送時間について

このページの内容は,2004-05-24の時点で,かなり古くなっている.近々に,この内容をupdateしなけれ ばいけない.

1. はじめに

MathLinkを利用したプログラムを作る時には,転送による時間がどのくらいかかるか,ということを考えて全体のプログラムを設計する必要があります.ところが,MathLinkの転送速度は,マシン,オペレーティングシステムなどの環境にかなり影響を受けます.そこで,自分のプログラムの環境で,それを簡単に測定して比較しやすくする道具をつくりました.その結果を示してあります.おなじマシンでもOSが違い,プロトコルが違うだけで100倍以上もの差がでています.興味のあるかたは,ぜひ測定の道具をダウンロードして,自分のマシンの転送速度を測定してみてください.また,結果を教えていただければ,結果リストに載せて他のかたの参考しようと思いますので,ご協力いただければ幸いです.

2. 計測結果

計測の結果は,100000個の整数のリストをカーネルからMathLinkプログラムに送る時間です.この時間が短い程転送が速いということです.このテーブルを参照.

3. 計測準備

自分のシステムに適合するMathLinkテスト用プログラムをダウンロードしてください.プログラムには,バイナリプログラムとノートブックがあります.計測は数分で終わります.

3.1 notebookをダウンロード

以下のノートブックをダウンロードしてください. test-J.nb(45.9kb)

3.2 MathLinkプログラムをダウンロード

以下のなかから,実行プログラムをダウンロードしてください.

もし,バイナリがなければ,以下のソースプログラムをコンパイルしてください.Unix系であれば,PC Linux版をコンパイルしてください.

3.3 最新のMathLinkライブラリ

最新のMathLinkライブラリは,バージョン3のリビジョン7(1999.10)です.リビジョンは以下の方法で調べられます.

  • Macintoshなら,機能拡張にある MathLinkLibrariesを選びファインダの「情報をみる」を選ぶとバージョンのところに記してあります.
  • Windows95/98なら,Windows:System:のml32i*.dll と mlmap32.mlp, mltcp32.mlpのそれぞれのファイルを選択した後,右ボタンをクリックして出てくるプロパティの「バージョン情報」に記されています.

Wolframのサイトから最新のMathLink Developer Kit(このなかにMathLink Libraryが入っている)をダウンロードできます.

4. 計測

ノートブックtest.nbと実行プログラムaddtwo.exeを計測するコンピュータ上に置きます.また,そのコンピュータですでにMathematicaが動いている必要があります.他のバックグラウンドプロセスは,可能な限り少なくしておきます.

  1. test.nbを開き,対応するマシンのところのセルを開いて下さい.セルを順に評価します.マシンによってaddtwo.exeの実行方法が違いますので,test.nbの記述に従って下さい.
  2. そうすると,addtwo.exeとのリンクが作られ,以下の式を評価しデータ転送時間を計測します.
    In[1]:= Fit[Table[{i, SendList[Table[123, {i }]]}, 
    	{i, 1, 100000, 10000}], {1, x}, x] /. {x -> 100000}
    Out[1]=
    7.53437
    この式の結果が,100000個の整数リストの転送に要した時間になります.この計測では,7.53437秒でした.数回評価を行うと値のばらつきがわかります.

5. 道具の解説

以下がMathLinkのテンプレートで,Clock[]SendList[list]を定義しています.

:Begin:
:Function:       clockcount
:Pattern:        Clock[]
:Arguments:      { }
:ArgumentTypes:  { }
:ReturnType:     Real
:End:
:Begin:
:Function:	sendlist
:Pattern:	SendList[a_List]
:Arguments:	{Clock[], a}
:ArgumentTypes:	{Real, IntegerList}
:ReturnType:	Real
:End:

ここで,SendList[list]の:Arguments:の引き数に注目してください.このなかでClock[]を呼んでいます.そこで,SendList<でデータを送る直前に,Clock[]による時間が引き数としてSendList[list]におくられることになります.

以下がCの関数clockcount()です.システム毎に違うシステムコールを利用しています.

#if MACINTOSH_MATHLINK | WINDOWS_MATHLINK
double clockcount()
{
	return(((double)clock())/CLOCKS_PER_SEC - start_time);
}
#endif
#if LINUX_MATHLINK
double clockcount()
{
	struct timeval tv;
	struct timezone tz;
	
	gettimeofday(&tv, &tz);
	return(tv.tv_sec + tv.tv_usec / 1000000.0 - start_time);
}
#endif

以下が,sendlistのCの関数です.そこで,Clock[]での値から,現在のclockcount()の値を引いたものを返しています.つまり,SendListでは,現在の時間と引き数の時間を引き算した値が返されます.

double sendlist(double t0, int *a, long alen)
{
	return(clockcount() - t0);
}

そこで,SendList[list]の返す値は,(Clockの実数の返る時間)+(整数リストの送られる時間)になります.これを以下の図でしめします.

time.png

以下は,SendListを使った簡単な時間計測です.

In[1]:=
Fit[z = Table[{i, SendList[Table[123, {i }]]},
   {i, 1, 200000, 10000}], {1, x}, x]
Out[1]=
0.000453985 + 0.0000222055 x</pre>
In[2]:=
ListPlot[z]
plot.png

転送時間が,ほとんど転送するデータ数に比例していることが良くあらわれています.

6. 検討

ここでは,ローカルマシ上での転送を測定したが,ことなるマシン上での転送については計測していません.これは,いろいろな条件を整えるのが難しいと考えたためです.将来的には計測する予定.

6.1 Macintoshの場合

Macintoshのデータを調べてみると,MacOS 8.6からMacOS 9.0になって,データ転送速度がPPCの場合で5倍近く向上しました.これに関連し,MacOS8.1になって急にMathLinkのデータ転送が5倍ほど遅くなったことがありました(MathLink のバグというより OSとの関連によるバグでしょうか).もし,それが解消されたとすれば,なにはともあれ喜ぶべきことです.

PPCとTCPの転送速度をみると,PPCのほうが高速です.MacOS9では14倍近くになります.PPCのローカルマシン上での転送がもっとも最適化されているようです.

6.2 Windowsの場合

Windows95の場合,TCPによる転送がFileMapに比べて5倍ほどかかっています.また,TCP転送を同じマシンのLinuxと比べても7倍近く遅いです.ずいぶんと遅いのでWindows98やWindows2000でどの程度向上しているか気になります.

6.3 Linuxの場合

LinuxもしくはUnix系ではPipeプロトコルがTCPと比べてると16倍高速です.ただし PipeプロトコルはLaunchの場合しか利用できません.

7. リンク

Mathematicaのベンチマークは,http://smc.vnet.net/mathbench.html にありますので参考にしてください.

8. その他

内容を利用される場合は,作者までご連絡ください.また,データは正確なものを期しますが,作者,またはデータ測定者は,それによる一切の責任は負うことはできません.


添付ファイル: filetime.png 1件 [詳細] fileplot.png 2件 [詳細]

このページの著作権は,すべて宮地 力に所属します.
もし,内容を利用される場合は,宮地までメールにて,ご連絡ください.
また,このページへのリンクは,フリーです.