-j -Nを使用したGNUパラレルは依然として1つのCPUを使用します。

-j -Nを使用したGNUパラレルは依然として1つのCPUを使用します。

リソースを飽和させずにマルチコアノードで合理的な並列化を取得する方法は?他の多くの同様の質問と同様に、問題は合理的なパフォーマンスのためにGNU Parallelを調整する方法を学ぶ方法です。

次の例では、リソースが飽和しておらず、プロセスを並列に実行できないか、-j -N特定のオプションを使用した後、すべてが1つのCPUで実行されるように見えます。

マルチコアシステムで実行される Bash スクリプト内では、次のループが GNU Parallel に渡されます。

for BAND in $(seq 1 "$BANDS") ;do
        echo "gdalmerge_and_clean $VARIABLE $YEAR $BAND $OUTPUT_PIXEL_SIZE_X $OUTPUT_PIXEL_SIZE_Y"
done |parallel

しかし、これにより機械が飽和し、処理速度が遅くなる可能性がある。

man parallel私が読んだ後

--作業-N
-j -N
--max-procs -N
-P -N

CPU スレッド数から N を引いた数です。

あまりにも多くのタスクを並列に実行してください。評価された数値が1未満の場合、1が使用されます。

参照: --スレッド数 --コア数 --ソケット数

使ってみました。

|parallel -j -3

ただし、何らかの理由で、これは40個のCPUのうちの1つだけを使用します。 [h]top チェックを使用すると、CPU 1 つだけが高い使用量で報告され、残りは 0 に低下します。 「CPU数」は使用しないでください-j -3。たとえば、3の場合、CPUは37個になります。

それからさっき通話を延長した

-j -3 --use-cores-instead-of-threads

盲目的にするようです。私は読んだhttps://unix.stackexchange.com/a/114678/13011そして、これらの並列ジョブを実行するために使用しているクラスタの管理者から学びました。ハイパースレッディングが無効になっています。。これはまだCPUで実行されます。

今、私は次を使用しようとしています。

for BAND in $(seq 1 "$BANDS") ;do
        echo "gdalmerge_and_clean $VARIABLE $YEAR $BAND $OUTPUT_PIXEL_SIZE_X $OUTPUT_PIXEL_SIZE_Y"
done |parallel -j 95%

または|parallel -j 95% --use-cores-instead-of-threads

ノート

ちなみに、これはHTCondorを介してスケジュールされたバッチジョブの一部であり、各ジョブは約40個の使用可能な物理CPUを持つ別々のノードで実行されます。

上記では必要な部分だけを維持しました。パイプされた完全なforループはparallel次のとおりです。

for BAND in $(seq 1 "$BANDS") ;do
   # Do not extract, unscale and merge if the scaled map exists already!
   SCALED_MAP="era5_and_land_${VARIABLE}_${YEAR}_band_${BAND}_merged_scaled.nc"
   MERGED_MAP="era5_and_land_${VARIABLE}_${YEAR}_band_${BAND}_merged.nc"
   if [ ! -f "${SCALED_MAP+set}" ] ;then
       echo "log $LOG_FILE Action=Merge, Output=$MERGED_MAP, Pixel >size=$OUTPUT_PIXEL_SIZE_X $OUTPUT_PIXEL_SIZE_Y, Timestamp=$(timestamp)"
       echo "gdalmerge_and_clean $VARIABLE $YEAR $BAND $OUTPUT_PIXEL_SIZE_X >$OUTPUT_PIXEL_SIZE_Y"
   else
       echo "warning "Scaled map "$SCALED_MAP" exists already! Skipping merging.-""
   fi
done |parallel -j 95%
log "$LOG_FILE" "Action=Merge, End=$(timestamp)"
where `log` and `warning` are a custom functions

答え1

デバッグするには、まずthanを使用することをお勧めしますgdalmerge_and_clean

努力する:

seq 100 | parallel 'seq {} 100000000 | gzip | wc -c'

各CPUスレッドが1つのジョブを正しく実行していますか?

seq 100 | parallel -j 95% 'seq {} 100000000 | gzip | wc -c'

20個のCPUスレッドごとに19個のジョブを正しく実行しますか?

私の考えでは、gdalmerge_and_clean実際には正しい数のインスタンスで実行されていますが、I / Oによって異なり、それを待っているようです。したがって、CPUがアイドル状態で待機している間、ディスクまたはネットワークは最大値に達します。

を使用して、正しい数のレプリカが開始されたことを確認できますps aux | grep gdalmerge_and_clean

ディスクが使用中であることを確認できますiostats -dkx 1

関連情報