コンパイルのターゲット

Compileオプションはコンパイルされた関数のターゲットのランタイムシステムを指定する.デフォルト設定はで,これは従来のWolfram言語仮想マシンのためのコードを作成する.この仮想マシンについてはコンパイルされた関数の操作のセクションで詳述してある.

を使って次のようなCコードを生成することもできる.

In[1]:=
Click for copyable input
Out[1]=

この関数はWolfram言語の仮想マシンで実行されているコンパイルされた関数と同じように働く.

In[2]:=
Click for copyable input
Out[2]=

しかし,InputFormはコンパイルされた関数が実際にはLibraryFunctionを含んでいることを示している.

In[3]:=
Click for copyable input
Out[3]//InputForm=

LibraryFunctionを直接呼び出すこともできる.

In[4]:=
Click for copyable input
Out[5]=

生成されたコードに外部呼出しの必要がある場合も期待通りの動作をする.

In[6]:=
Click for copyable input
Out[7]=
In[8]:=
Click for copyable input
Out[8]=

適切なCコンパイラがない場合はをCに設定することができないので注意のこと.設定しようとすると警告メッセージが表示される.

計算の高速化

をCに設定する最大の理由は計算の高速化である.これは多くの場合非常にうまくいく.

次の例はCコードが従来のWolfram言語仮想マシンよりもいかに高速であるかを示している.

In[9]:=
Click for copyable input
Out[10]=
In[11]:=
Click for copyable input
Out[12]=

常にかなりの高速化がはかれる訳ではない.行列かける行列のように費用がかかる内部関数が呼ばれた場合は,CでもWolfram言語仮想マシンでもかかる時間はあまり変わらないであろうから,このような場合は高速化による恩恵はないことになる.

従来のコンパイルされた関数の実行の際のように,Wolframシステムコンパイラを使用している際の外部呼出しもまた効率を下げることがある.特に,未定義の外部呼出しは避けるべきである.

上記以外で影響がある事柄にCatchMachineOverflowCatchMachineUnderflowCatchMachineIntegerOverflow等のRuntimeOptionsの使用が挙げられる.先に説明したように,これらは皆コンパイルされた関数の効率に影響する.

ListabilityとParallelization

Cの実行に併せてCompileにListabilityとParallelizationをセットで設定することができる.

In[22]:=
Click for copyable input
Out[24]=

同じ関数でCをターゲットとするなら,かなりな程度の高速化になる.

In[25]:=
Click for copyable input
Out[27]=

並列で計算を実行するとさらにスピードがアップする.

In[28]:=
Click for copyable input
Out[30]=

最後はWolfram言語関数を使った計算で最速の方法の1つの例である.

ライフサイクル

がCに設定されると, LibraryFunctionが作られ,これがコンパイルされた関数に埋め込まれる.InputFormを使ってLibraryFunctionを見ることができる.

In[1]:=
Click for copyable input
Out[3]//InputForm=

この変換は,CCodeGeneratorパッケージを使ってWolframライブラリのためのCコードを生成し,次に(CreateLibraryを使って) CCompilerDriverパッケージを使いコードを実際のライブラリにコンパイルする.ライブラリはすべて各Wolframシステムセッションで一意的な一つのフォルダに置かれる.

デフォルト設定は,コンパイルが終了したときに一時的なファイルすべてを削除する設定になっている.さらに,カーネルセッションが終了すると,生成されたライブラリはすべて削除される.

CreateLibraryへの呼出しのオプション設定を変更したい場合は,を使ってこれを行うことができる.これは,生成されたコードを検査したりデバッグしたりする等のさまざまな理由のために役立つ.

生成されたコードの検査

生成されたコードを検査するためには,CreateLibraryのデフォルト動作を変更する必要がある.これによって生成された中間ファイルはすべて削除され,オプションによって制御される.変更は以下下のようになる.

In[11]:=
Click for copyable input

これでをCに設定することによってコンパイルされた関数を生成できるようになる.

In[12]:=
Click for copyable input
Out[3]//InputForm=

使用されたCコードを見付ける.

In[20]:=
Click for copyable input
Out[20]=

Cコードを表示する.これらの項目の意味はCCodeGeneratorのドキュメントに記載されている.

In[21]:=
Click for copyable input
Out[21]=

中間ファイルが削除されないようにすると,Wolframシステムセッションが終了したときに,生成されたコードのフォルダが整理されることを妨げる.この時点で,ファイルを自分で削除した方がよいこともある.

コードを生成する際の出力

コードを生成しているときに,Cコンパイラからの出力を見るには, CreateLibraryにオプションを加えなければならない.これは,Printに設定することで行うことができ,以下にその例を示す.

In[22]:=
Click for copyable input

これでCコンパイラが実行されるときに出力が見えるようになった.

コードを生成する際のCコンパイラのコマンド

コードを生成しているときにCコンパイラに与えられるコマンドを見るためには,CreateLibraryにオプションを加える必要がある.これは,Printに設定することで行うことができ,以下にその例を示す.

In[1]:=
Click for copyable input

これでCコンパイラを実行するために与えられるコマンドを見ることができるようになった.

生成されたコードのデバッグ

生成されたコードをデバッグするためには,デバックのオプションをCreateLibraryに加える必要がある.これらは,Cコンパイラの種類によって異なる.Visual Studioについては,以下のように設定することができる.

In[11]:=
Click for copyable input

中間ファイルが保存されるように,Falseに設定しなければならない.またデバッグの情報が結果のライブラリに挿入されるようにを設定する必要がある.

これでデバッグ環境を起動し,Wolframシステムプロセスに接続できるようになったはずである.その後Cコードを開き,ブレイクポイントを設定することができる.