通过并行调用 GCC 最大限度地减少磁盘使用

通过并行调用 GCC 最大限度地减少磁盘使用

我正在尝试并行测试 GCC。在给我测试报告之前,我的设置将运行 96 次测试。

如果我按顺序运行这些测试,它将调用 GCC 一次,运行可执行文件,收集诊断信息,然后重复。然而,当我尝试并行运行这些测试时,对 GCC 的调用需要更多时间。

我的探查器告诉我,(对 96 个测试进行平均)在按顺序运行 96 个测试时,对 GCC 的调用占总执行时间的 2%。我的机器有 8 个核心,当我在程序上运行相同的分析器但有 8 个可用线程(每个线程 12 个测试)时,对 GCC 的调用占总时间的 12%。

我推测本例中的操作系统可能是共享资源,并尝试告诉 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 位置来解决此问题,但这几乎没有任何区别。对此位置的写入由我作为参数传递给上述函数的路径指定,

相关内容