19

複数のプロセッサを利用できるように、gnu octave を使用して複数のスレッドをプログラムできるようにしたいと考えています。

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

yum install octave

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

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

4

3 に答える 3

27

解決

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

私はこれを行うことができました。最初にソース コードから 'ATLAS' をコンパイルし、システムで使用できるようにして、オクターブがそれを見つけてそれらのライブラリ関数を使用できるようにします。ATLAS は、システムとコア数に合わせて調整します。ソースから octave をインストールして ATLAS を指定すると、それが使用されます。そのため、octave が巨大な行列乗算のような重い操作を行う場合、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-atlas、、、 cblas-atlasです lapack-atlas

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

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

Atlas を使用する際の欠点:

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

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

提案

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

于 2012-08-09T17:56:53.480 に答える
7

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

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

于 2014-02-17T09:18:28.133 に答える
3

エリックが提案したように、ATLASを使用してみましたが、パフォーマンスが 3 倍向上しました (NN 学習アプリケーションでは、主なコストは行列の乗算です)。驚いたことに、まだ 1 つのコアしか使用していないようでした。さらに調査した後、私はOpenBLASに出くわし、箱から出してすぐに複数のコアを使用し始め、パフォーマンスをさらに 2 倍向上させました (ただし、コアは 2 つしかありませんでした)。さらに絞り込みたい場合は、 MKLを使用することもできますが、依存関係のためにディスク容量が大きくなります。パッケージ community/ atlas-lapack-baseおよび aur/ openblas-lapack

で Arch Linux を使用していました。それぞれをインストールすると、Octave で使用されるデフォルトのものに切り替わりました。これらのライブラリを比較する優れたベンチマークは次のとおりです。

http://www.tcm.phy.cam.ac.uk/~mjr/linpack/

于 2016-05-22T11:01:08.283 に答える