(Как) компилятор компилирует монолитную программу как многопоточную?

#c #multithreading #compiler-construction

#c #многопоточность #построение компилятора

Вопрос:

Я написал монолитную программу, которая довольно приблизительна к потребностям процессоров. И поскольку у меня двухъядерный процессор, я решил, что поэтому один процессор должен быть всегда на 100%. Но оба моих процессора постоянно работают на 100%. Теперь я предполагаю, что мой компилятор каким-то образом превратил мое монолитное приложение в многопоточное. Каковы пределы этих функций оптимизации и когда все еще необходимо явно создавать что-то многопоточное?

Я использую gcc в 64-разрядной версии Ubuntu linux

Комментарии:

1. Ваше предположение звучит ошибочно.

2. Вы уверены, что именно ваша программа использует оба процессора?

3. @Sim: Вы использовали что-то вроде top(1) для проверки того, что процесс вашей программы фактически использует оба процессора на 100%?

4. Это также может зависеть от того, что делает ваша программа. Если вы передаете огромные объемы данных в стандартный вывод, вы также можете привязать эмулятор терминала и графическую среду. Я вижу это время от времени.

5. @Adam, спасибо, что ты не знал об этом shelltool, он показал, что XORG прыгает, как только моя программа запускается, вероятно, из-за ее быстрого вывода. Я действительно запускал там в довольно ошибочном предположении, спасибо. Если вы предоставите это в качестве ответа, я приму его.

Ответ №1:

Это не так, по крайней мере, без использования чего-то вроде Cilk. Вы, должно быть, непреднамеренно используете несколько потоков (или процессов), не осознавая этого. Возможно, вы используете стороннюю библиотеку, которая создает один или два дополнительных потока в вашем процессе?

[ПРАВИТЬ / ПРАВИТЬ КОД]

Согласно комментариям, используйте программу, подобную top(1) для проверки того, что на самом деле процесс вашей программы использует оба процессора на 100%. В вашем случае процесс XORG переходит на 100%, потому что ваша программа выдает большой объем выходных данных.

Комментарии:

1. Я просто использую STL-контейнер, все остальное я реализовал самостоятельно

Ответ №2:

Любые вызовы ОС или других библиотек (например, CRT) могут также использовать другие потоки. Я вряд ли удивлюсь, если консоль будет работать в своем собственном потоке, и если вы выполняете много операций ввода-вывода любого рода, это может привести к максимальной загрузке другого процессора.