4

出力を生成するために、かなり大きなプログラム セットをコンパイルして実行するメイクファイルがあります。一部のプログラムはシングルスレッドで、一部は OpenMP を使用して複数の CPU コアで実行されます。かなりの数のタスクは実行に時間がかかるため、make に「-j」オプションを渡して、シングルスレッド プログラムを並行して実行できるようにすると便利です。ただし、OpenMP タスクは既に使用可能なすべての CPU コア (およびかなりの量の RAM) を使用しているため、一度に 1 つずつ実行する必要があります。

Makefile で OpenMP を使用するタスクにアタッチできるフラグはありますか? これにより、他のタスクが並行して実行されるのを防ぎ、他のタスクが他の時間に並行して実行されるようになりますか? .NOTPARALLEL 特別なターゲットは、すべての並列処理を完全に無効にすると思います。

4

1 に答える 1

1

次の 3 つの可能性が考えられます。

1) 相互に依存している場合、make はタスクを並行して実行しません。そのため、単独で実行したいターゲットに偽の依存関係を追加することで、make をだますことができます。たとえば、OpenMP ターゲットがすべてのシリアル ターゲットの出力に依存することを宣言します。

2) Makefile を 2 つの異なるものに分割することもできます。1 つは並列で実行されない OpenMP ターゲット用で、もう 1 つはシリアル ターゲット用です。これは、OpenMP とシリアル ターゲットの間に相互依存関係がないことを意味します。

3) コンパイルと実行を分割します。bash スクリプトを使用して、必要に応じて実行します。

于 2012-09-06T06:52:08.280 に答える