web-dev-qa-db-ja.com

Get GNU Octaveをマルチコアプロセッサで動作させます。(マルチスレッド)

複数のプロセッサを利用するように、gnuoctaveで複数のスレッドをプログラムできるようにしたい。

GNU OctaveをFedora17 Linuxにインストールし、次のことを行いました。

yum install octave

これは私のコンピューターに最新バージョンのオクターブ3.6.2をインストールしました。これはうまく機能しますが、2つの巨大な行列を乗算すると、オクターブが使用する1つのCPUが停止します。この場合、CPUが明らかにボトルネックであるため、行列の乗算ですべてのコアを使用できれば便利です。

オクターブはマルチコアプロセッサを完全に利用し、複数のスレッドで実行できますか?このためのライブラリまたはコンパイル時フラグはありますか?

19
Eric Leschinski

ソリューション

Octave自体は、1つのコアで実行されるシングルスレッドアプリケーションです。複数のコアを利用するATLASのようないくつかのライブラリを使用するためにオクターブを取得できます。したがって、Octaveは1つのコアのみを使用しますが、重い操作が発生すると、octaveは多くのCPUを使用するATLASの関数を呼び出します。

私はこれを行うことができました。まず、ソースコードから「ATLAS」をコンパイルし、システムで使用できるようにして、オクターブがそれを見つけてそれらのライブラリ関数を使用できるようにします。 ATLASは、システムとコアの数に合わせて調整します。ソースからオクターブをインストールしてATLASを指定すると、それが使用されるため、オクターブが巨大な行列乗算などの重い操作を実行する場合、ATLASは使用するCPUの数を決定します。

これをFedoraで機能させることはできませんでしたが、Gentooでは機能させることができました。

私はこれらの2つのリンクを使用しました: ftp://ftp.gnu.org/gnu/octave/

http://math-atlas.sourceforge.net/

ATLASのインストールの前後に次のオクターブコアを実行しました:

tic
bigMatrixA = Rand(3000000,80);
bigMatrixB = Rand(80,30);
bigMatrixC = bigMatrixA * bigMatrixB;
toc
disp("done");

行列の乗算は、複数のプロセッサを使用するとはるかに高速になります。これは、シングルコアの場合よりも3倍高速でした:

Without Atlas: Elapsed time is 3.22819 seconds.
With Atlas:    Elapsed time is 0.529 seconds.

私が使用している3つのライブラリは、速度を上げるためにblas-atlascblas-atlaslapack-atlas

オクターブがデフォルトのblasおよびlapackライブラリの代わりにこれらを使用できる場合、マルチコアを利用します。

ATLASを使用してソースからコンパイルするオクターブを取得するには、簡単ではなく、プログラミングスキルが必要です。

アトラス使用の欠点:

このAtlasソフトウェアは、多くのオーバーヘッドを使用して、オクターブプログラムを複数のスレッドに分割します。確かに、巨大な行列の乗算だけを実行している場合ははるかに高速になりますが、ほとんどのコマンドをアトラスでマルチスレッド化することはできません。コアから処理能力/速度のすべてのビットを抽出することが最優先事項である場合は、プログラムをそれ自体と並行して実行するように作成するだけで、はるかに幸運に恵まれます。 (プログラムを問題の1/8で動作する8つの同等のプログラムに分割し、それらをすべて同時に実行します。すべてが完了したら、結果を再構成します)。

Atlasは、シングルスレッドのオクターブプログラムがマルチスレッドアプリのように動作するのに役立ちますが、特効薬ではありません。 Atlasは、シングルスレッドのOctaveプログラムを2,4,6,8コアプロセッサを最大限に活用することはありません。パフォーマンスの向上に気付くでしょうが、向上により、すべてのプロセッサを使用するためのより良い方法を探すことになります。答えは、それ自体と並行して実行するようにプログラムを作成することです。これには、多くのプログラミングスキルが必要です。

提案

最も重い操作をベクトル化し、n個の同時実行スレッドにプロセスを分散することにエネルギーを注ぎます。プロセスの実行を待つ時間が長すぎる場合は、プロセスを高速化するために最も効果が低いのは、より効率的なアルゴリズムまたはデータ構造を使用することです。

27
Eric Leschinski

Octave-Forge には、並列コンピューティングを扱う2つのパッケージがあります。

fork()関数を使用してサブプロセスを生成することもできます。

7
Twonky

Ericが提案したように、[〜#〜] atlas [〜#〜]を使用してみたところ、パフォーマンスが3倍向上しました(NN学習アプリケーションでは、主なコスト行列の乗算です)。驚いたことに、それはまだ1つのコアだけを使用しているように見えました。さらに調査した後、私はOpenBLASに出くわし、箱から出して複数のコアを使用し始め、パフォーマンスをさらに2倍向上させました(ただし、コアは2つしかありませんでした) )。さらに絞り出したい場合は、[〜#〜] mkl [〜#〜]を使用することもできますが、ディスク容量が大きくなります。依存関係のため。

ArchLinuxをパッケージcommunity /atlas-lapack-baseおよびaur /openblas-lapack。それらのそれぞれをインストールすると、Octaveで使用されるデフォルトのものが切り替わりました。

これらのライブラリを比較した優れたベンチマークは次のとおりです。 http://www.tcm.phy.cam.ac.uk/~mjr/linpack/

2
fala