2

多くの計算(CFD)を実行する単純なCプログラムを実行しているため、実行に時間がかかります。しかし、私はまだ多くの未使用のCPUとRAMを持っています。では、処理能力の一部を1つのプログラムにどのように割り当てるのでしょうか。

4

4 に答える 4

2

Linuxは、計算を行う必要があるときにプログラムを待機させたり、CPUを解放したりしません。マルチコアCPUと1つのシングルスレッドが実行されているか(@Pankratesによって提案されているように)、一部のI/Oをブロックしています。

于 2013-02-09T10:24:15.903 に答える
2

CFDは数値流体力学を意味すると思います(しかし、CFDには他にも多くの意味があるので、間違っていると思います)。

あなたは間違いなく最初にあなたのコードをプロファイリングするべきです。少なくとも、それをコンパイルして、gprofgcc -Wall -pg -Oの使用方法を学びます。また、コードによって実行されたシステムコールを見つけるために使用することもできます。strace

私はCFDの専門家ではありません(前世紀にCFDの専門家と仕事をしたとしても)。しかし、そのようなコードは、多くの有限要素解析やその他のベクトル計算を使用します。

コードを記述している場合は、OpenMPの使用を検討するか(ソースコードにOpenMPプラグマを注意深く追加することで、速度を上げることができます)、 GPUで実行されるOpenCLカーネルをコーディングしてGPGPUの使用を検討することもできます。

また、 pthreadプログラミングの詳細を学び、スレッドを使用するようにコードを変更することもできます。

BLASなどの重要な数値ライブラリを使用している場合は、多くの調整が行われ、特殊なバリアント(マルチコア、OpenMP-ed、さらにはOpenCLなど)もあります。

いずれの場合も、コードの並列化は大変な作業です。可能であれば、改善に数週間から数か月を費やします。

于 2013-02-09T16:17:23.100 に答える
1

一度に複数のCPUを使用するには、プログラムの複数のコピーを実行するか、プログラム内で複数のスレッドを実行する必要があります。どちらも始めるのはそれほど難しいことではありません。

ただし、「A = A + Bがたくさんある」よりも、「10000個の大きな数があるので、それぞれについて素数かどうかを調べたい」の並列バージョンを実行する方がはるかに簡単です。並列で計算を入力します-次のステップを実行する前に新しいAが必要になるためです。CFD計算は、[私が理解している限り]後者を実行する傾向がありますが、大きな配列を使用します。大きなベクトル計算を小さなベクトル計算のセットに分割できる場合があります[たとえば、1000 x 1000の行列がある場合、それを250 x 1000行列の4セット、または500x500行列の4セットに分割できます。独自のスレッドでそれらのそれぞれを実行します]。

それがあなた自身のコードであるなら、あなたはそれが何をするのか、そしてそれがどのように機能するのかをうまくいけば知っています。それが他の誰かのコードである場合は、コードを所有している人と話す必要があります。

「より多くのCPUを自動的に利用する」という魔法の方法はありません。クアッドコアプロセッサでの30%のCPU使用率は、おそらくシステムが基本的に1つのコアを使用していることを意味し、5%程度は、システムで行われている他のことのオーバーヘッドです。 CPUの少しはそれがすることは何でもします。または、アプリケーションはマルチスレッドですが、共有リソースを介してスレッド間に競合があるため、マルチコアを完全には使用していません...これらの3つの[または他のいくつかの]選択肢のどれかを言うことは不可能です。

あなたがそのメモリに入れるのに役立つ何かを持っていない限り、より多くのRAMを要求することは役に立ちません。空きメモリがある場合、アプリケーションは必要なだけのメモリを取得します。

于 2013-02-09T13:39:24.800 に答える
1

負の増分でプロセスをうまく処理することもできますが、そのためにはスーパーユーザーである必要があります。見る

man nice

これにより、プロセスのスケジューリングの優先順位が上がります。CPU時間を他のプロセスと競合している場合は、CPU時間が長くなるため、「より高速に実行」されます。

プログラムが使用するRAMの量を増やすことに関しては、より多くのRAMを使用するように、プログラムを書き直すか再構成する必要があります。質問で入手可能な情報を考えると、これ以上言うのは難しいです。

于 2013-02-09T10:18:32.193 に答える