GCC를 병렬로 테스트하려고합니다. 내 설정에서는 테스트 보고서를 제공하기 전에 96개의 테스트를 실행합니다.
이러한 테스트를 순차적으로 실행하면 GCC를 한 번 호출하고 실행 파일을 실행하고 진단을 수집하고 반복합니다. 그러나 이러한 테스트를 병렬로 실행하려고 하면 GCC 호출에 더 많은 시간이 걸립니다.
내 프로파일러에 따르면 (평균 96개 이상의 테스트) 96개의 테스트를 순차적으로 실행할 때 GCC 호출이 전체 실행 시간의 2%를 차지한다고 합니다. 내 컴퓨터에는 8개의 코어가 있고 프로그램에서 동일한 프로파일러를 실행할 때 8개의 스레드를 사용할 수 있지만(스레드당 12개의 테스트) GCC 호출은 총 시간의 12%를 차지합니다.
이 경우 OS가 공유 리소스일 수 있다고 추측하고 GCC에 실행 파일을 tmpfs 위치로 출력하도록 지시했지만 이로 인해 거기에서 소비한 총 시간이 11%로 줄었습니다. 누구든지 나를 여기로 안내하는 데 도움을 줄 수 있나요? 저는 파일 시스템과 Linux(Ubuntu 20)에서 IO 쓰기가 작동하는 방식에 대해 잘 모릅니다.
제 테스트 코드가 꼭 틀렸다고는 생각하지 않지만 어쨌든 포함하겠습니다. 하스켈로 작성되었습니다. 테스트가 순차적으로 실행될 때 이 기능은 전체 시간의 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 위치에 작성하여 이 문제를 해결하려고 시도했지만 거의 차이가 없었습니다. 이 위치에 쓰는 작업은 위 함수에 인수로 전달한 경로에 의해 지정됩니다.