Я так понимаю, про многопоточность ты ничего не знаешь. Упрощённо: одно ядро- один поток, это классика. Я читал какую-то херь, где ядро может создавать два и боле потоков, если углубляться, то речь о названиях пойдёт. Итак, 18 ядер- 18 потоков. Допустим. Во-первых, чтобы действительно создать 18 потоков, их создание должно быть прописано программе, то есть:
gcc блаблабла
должен сам по себе (то есть это должно быть прописано в его коде) создавать 18 (или несколько) потоков. Но процесс
gcc не порождает несколько потоков, а делает всё одним потоком, хотя смысл в создании нескольких потоков есть. Например, если у тебя несколько исходников, и из каждого делается объектный файл, независимо друг от друга, то можно создать несколько потоков, но, наверное, фактически всё сведётся к запуску нескольких экземляров gcc (почему нет?).
Почему это распространено не так, как хотелось бы. Дело в том, что если распараллелить процесс, например на два потока никакого двукратного выигрыша в скорости не будет. А потому, что потоки имеют разделяемые ресурсы (оперативную память ту же самую. Это по минимуму), и нужно, чтобы они друг другу не мешали. Прикинь, чё будет, если они будет одновременно писать в одну и ту же область оперативной памяти- напомню, они друг о друге ничего не знают, работа полностью независима. Чтобы катавасии не случилось, существуют специальные программы-планировщики потоков. Регуляторы разделяемых ресурсов, так скажем, и на их долю работы отводится до хрена процессороного времени. Во сколько реально увеличивается скорость вычислений- существуют специальные тесты. Если два ядра вместо одного, где-то в 1,3 раза увеличивается. Ожидаемая отдача там, где у потоков нет общих ресурсов. Например, шахматная задача. Один поток просчитывает один вариант, другой другой. Так это проще на двух компах запустить и всё.