はじめに
Wolframシステムのコンパイラは,高速化とWolfram言語計算の両方に取って大切な方法を提供する.このコンパイラは計算についての仮定を行い,計算をより効率的な方法に書き直す.これらの仮定はWolfram言語の普遍性を制限するものかもしれないが,重要な計算クラスの向上のために選ばれたものである.例えば,機械精度演算を含む計算は向上する.
コンパイラはWolfram言語をより高速にするのに加えて,Wolfram言語の計算を分析し処理することができるので有用である.コンパイラは外部コードの生成のような役に立つ機能の基礎となっている.
このチュートリアルではコンパイラがどのように動作するかの詳細について説明する.例えば計算のパフォーマンスをどのように改善するかを示してユーザがより効率的にコンパイラを使用できるようにする.
基本
Wolframシステムコンパイラを使う主な方法は関数Compileを使う方法である.
コンパイルされた関数は他の任意のWolfram言語関数と同じように実数入力を渡して使うことができる.
しかし,実数以外の入力をコンパイルされた関数に渡すと,メッセージが出される.それでもWolfram言語は結果を返すが,それはコンパイラを使わないで得られた結果である.
関数との比較
コンパイルされた関数をFunctionと比較することができる.両者は同様のコマンド構造で作られている.
CompiledFunctionを使った方が速い.
入力が機械入力ではない場合は,コンパイルされた関数は結果を返す前にメッセージを出す.
コンパイルされた関数の内部
一般に,Compileはコンパイルされた関数を評価するための一連の命令を含むCompiledFunction式を作成する.命令は最新のコンピュータハードウェアとソフトウェアライブラリが効率よく実行できるようなものが選ばれている.コンパイルされた関数のコンテンツは入力形で表示することができる.
コンパイルされた関数がCompiledFunctionTools`パッケージでどのように実行するかを見ることができる.これはWolframシステムのコード生成システムの重要な部分であり,コンパイルされた関数が何をするかを示すのにも役に立つ.
CompiledFunctionTools`パッケージを使用するためにはこれをロードしなければならない.
CompilePrintはコンパイルされた関数の詳細を示す.
コンパイラの呼出し
WolframシステムのコンパイラはCompiledFunctionが実行されるたびに呼び出される.これらはCompile関数への呼出しよって作られる.さらに,多くの関数が自身の操作の一環としてコンパイラを使おうとする.
NDSolve,FindRoot,FindMinimumのような多くの数値計算関数を含む重要なクラスがある.これらの関数には一般にCompiledオプションがある.このオプションを使ってコンパイラの使用を有効にしたり無効にしたりできる.これらの関数はそのデフォルト操作で初期設定や問題についての分析を行い,コンパイラを使うことが有益である場合にコンパイラを使う.
次はコンパイラを使わずにNDSolveを呼び出す.
コンパイラを使う別のクラスにTableやMap等のプログラミング関数がある.これらの関数は入力を分析し,コンパイラの使用で結果が変更されることなく,コンパイルされた関数の作成にそれほど時間が掛からない場合にコンパイラを使用する.
次ではコンパイラが使用されている.結果がパックアレーであるためコンパイラが使用されたことが分かる.
コンパイラの利点
このセクションではコンパイラの利点について,その要点を述べる.
計算の高速化
コンパイラの主たる利点はこれによってある種の計算が高速化される点である.
次で,CompiledFunctionとFunctionを使って2つの式を作る.
CompiledFunctionを使った方が速い.
CompiledFunctionの計算はコード生成器を使い並列計算することでさらに速くできる.
コード生成
コンパイラはコンパイルされた関数を評価するための一連の簡単な命令を作る.Wolfram言語にはこれらの命令が処理できる仮想マシンが含まれている.Wolfram言語はまた,これらの命令を使って他の言語で書かれた関数とプログラムの全体を作ることもできる.
次はExportStringを使ってCompiledFunctionをCコードに変換する方法を示している.
並列計算
最新のCPUアーキテクチャは一般にマルチコアを提供する.これらのコアを使ってコンパイラによってコンパイルされた関数を並列実行することができる.マルチスレッドを使うと計算すべてが効率よく実行できる.これはコンパイラが生成する簡単な命令によって可能となる.
こちらは連続的に行われている操作を示す.これには2倍の時間が掛かる.
一般に,$ProcessorCountはいくつのスレッドを使うかの確認に使われる.
筆者のコンピュータでは,$ProcessorCountは2である.並列計算が連続計算の2倍の速度になったのはこのためである.