C ++ / g ++: параллельная программа - PullRequest
1 голос
/ 14 июня 2010

Я получил программу на C ++ (источник), которая, как говорят, работает параллельно.Однако, если я скомпилирую его (я использую Ubuntu 10.04 и g ++ 4.4.3) с g ++ и запусту его, одно из моих двух процессорных ядер получит полную нагрузку, а другое ничего не делает.

Так что яговорил с тем, кто дал мне программу.Мне сказали, что я должен установить специальные флаги для g ++, чтобы программа была скомпилирована для двух процессорных ядер.Однако, если я посмотрю на код, я не смогу найти какие-либо строки, указывающие на параллелизм.

Поэтому у меня два вопроса:

  • Существуют ли какие-либо C ++ - встроенные функции длямногопоточные приложения, т.е. можно ли писать параллельный код без каких-либо дополнительных библиотек (потому что я не нашел ни одной нестандартной библиотеки)?
  • Правда ли, что действительно существуют флаги для g ++, которые сообщают компиляторускомпилировать программу для двух процессорных ядер и скомпилировать ее так, чтобы она работала параллельно (и если: каковы они)?

Ответы [ 4 ]

3 голосов
/ 14 июня 2010

AFAIK нет флагов компилятора, предназначенных для того, чтобы однопоточное приложение эксплуатировало параллелизм (это определенно нетривиальная операция), за исключением распараллеливания итераций циклов (-ftree-parallelize-loops), которые, тем не менее, должны бытьактивирован осторожно;тем не менее, даже если нет явного создания потоков, могут существовать некоторые директивы OpenMP для распараллеливания нескольких последовательностей команд.

2 голосов
/ 14 июня 2010

Ищите вхождение "thread" и / или "std :: thread" в исходном коде.

1 голос
/ 14 июня 2010

Единственное, о чем я могу думать, это openMosix или LinuxPMI (преемник openMosix). Если в коде используются процессы, то метод «миграции» процессов позволяет запускать процессы на разных компьютерах (на которых установлен указанный дистрибутив Linux).

Проверьте наличие потоков ( grep -i thread ), процессов ( grep fork ) в вашем коде. Если ничего из этого не существует, проверьте MPI . Насколько я помню, для MPI требуется дополнительная настройка (он использовался только для некоторых домашних заданий на факультете).

Как уже упоминалось, gcc (и другие) реализует некоторые способы параллелизма с OpenMP с некоторыми прагмами .

1 голос
/ 14 июня 2010

Текущий стандарт языка C ++ не поддерживает многопроцессорную обработку в языке или стандартной библиотеке.Предложенный стандарт C ++ 0x действительно имеет некоторую поддержку потоков, блокировок и т. Д. Мне неизвестны какие-либо флаги для g ++, которые волшебным образом заставили бы вашу программу выполнять мультиобработку, и трудно понять, что могут делать такие флаги.

...