GCCを並列に呼び出してディスク使用量を最小化

GCCを並列に呼び出してディスク使用量を最小化

GCCを並列にテストしようとしています。私の設定では、テストレポートを提供する前に96のテストを実行します。

これらのテストを順番に実行すると、GCCを一度呼び出し、実行可能ファイルを実行し、診断を収集して繰り返します。ただし、これらのテストを並列に実行しようとすると、GCC呼び出しに時間がかかります。

私のプロファイラによると(平均96を超えるテスト)、96のテストを順番に実行すると、GCC呼び出しは全体の実行時間の2%を占めます。私のコンピュータには8つのコアがあり、プログラムで同じプロファイラを実行するときに8つのスレッドを使用できますが(スレッドあたり12のテスト)、GCC呼び出しは合計時間の12%を占めます。

この場合、OSが共有リソースである可能性があると推測し、GCCに実行可能ファイルをtmpfsの場所に出力するように指示しましたが、これはそこで費やした合計時間を11%に短縮しました。誰もが私をここに案内するのに役立ちますか?私はファイルシステムとLinux(Ubuntu 20)でIO書き込みがどのように機能するのかわかりません。

私のテストコードは必ずしも間違っているとは思いませんが、とにかく含めます。 Haskellで書かれています。テストが順番に実行されると、この機能は合計時間の2%を占めますが、(現在)テストが8つのスレッド(8つの利用可能なコア)で並列に実行される場合は11%かかります。

create_test_executable :: String -> State -> String -> IO ()
create_test_executable p s path = do -- p = the c program, s = unused here, path = where to write executable
    let process = proc "gcc" ["-xc", "-"]
    x@(Just sin, Just sout, Just serr, _) <-
        createProcess process { std_in  = CreatePipe
                              , std_err = CreatePipe
                              , std_out = CreatePipe
                              , cwd     = Just path
                              }
    hPutStr sin p
    hFlush sin
    hClose sin
    o <- hGetContents sout
    if o == "" then return () else return () -- force read from output pipe
    cleanupProcess x

明確にすると、GCCは実行可能ファイルをディスクに書き込み、このディスクIOの競合のために各個々のテストが遅くなると思われます。実行可能ファイルをtmpfsの場所に作成してこの問題を解決しようとしましたが、ほとんど違いはありませんでした。この位置に書き込む操作は、上記の関数に引数として渡したパスによって指定されます。

ベストアンサー1

おすすめ記事