GCC 4.5 / Ubuntu 11.04 - это код автоматической многопоточности? - PullRequest
5 голосов
/ 26 июля 2011

Я заранее прошу прощения за то, что у меня нет подходящего жаргона для описания моей проблемы, и что я, вероятно, не предоставил достаточно информации.

Я уже несколько месяцев запускаю свой код MPI под gcc 4.4 и OpenMPI / MPICH2, и на разных платформах проблем нет. Недавно я обновил набор серверов и настольного компьютера до Ubuntu 11.04 (сейчас работает gcc 4.5) и выполнил 8 задач на узле с 8 процессорами. Обычно я вижу, что пользовательский процессор загружен почти на 100%, а теперь я вижу только 60% пользовательского процессора и более 30% системного процессора. Это приводит к значительному замедлению моего кода при запуске таким способом.

Продолжая расследование, я просто запустил последовательное задание и заметил, что процесс сообщил, что используется 150 +% времени процессора. Итак, моя программа была многопоточна на многих процессорах. Я проверил это явно, используя 'ps -eLF' и посмотрев на нагрузки на процессор.

Это невероятно плохая и неэффективная вещь для моего кода MPI, и я понятия не имею, откуда он взялся. Ничего не изменилось, кроме перехода на Ubuntu 11.04 и gcc 4.5. Я проверил это по различным версиям OpenMPI.

Я также перемещал двоичные файлы между двумя двоичными машинами, совместимыми с ними. Если я скомпилирую на другой машине (Ubuntu 10.10 / GCC 4.4) и запустить там, все в порядке. Перемещая двоичный файл на компьютер с Ubuntu 11.04, тот же самый двоичный файл начинает сам себя.

Стоит отметить, что я явно отключил все оптимизации (-O0), полагая, что моя настройка по умолчанию (-O3) может включать что-то, чего я не понимал в 4.5. Я получаю идентичное поведение независимо от уровня оптимизации.

Пожалуйста, дайте мне знать, какую дополнительную информацию я могу предоставить, чтобы определить источник этой проблемы.

* ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ *

Результаты ldd в ответ на запрос. Проще говоря, это OpenMPI, libconfig и scalapack, вместе со стандартным gcc материалом:

linux-vdso.so.1 =>  (0x00007ffffd95d000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f2bd206a000)
libconfig.so.8 => /usr/lib/libconfig.so.8 (0x00007f2bd1e60000)
libscalapack-openmpi.so.1 => /usr/lib/libscalapack-openmpi.so.1 (0x00007f2bd151c000)
libmpi.so.0 => /usr/lib/libmpi.so.0 (0x00007f2bd126b000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2bd0ed7000)
libblacsCinit-openmpi.so.1 => /usr/lib/libblacsCinit-openmpi.so.1 (0x00007f2bd0cd4000)
libblacs-openmpi.so.1 => /usr/lib/libblacs-openmpi.so.1 (0x00007f2bd0aa4000)
libblas.so.3gf => /usr/lib/libblas.so.3gf (0x00007f2bd022f000)
liblapack.so.3gf => /usr/lib/liblapack.so.3gf (0x00007f2bcf639000)
libmpi_f77.so.0 => /usr/lib/libmpi_f77.so.0 (0x00007f2bcf406000)
libgfortran.so.3 => /usr/lib/x86_64-linux-gnu/libgfortran.so.3 (0x00007f2bcf122000)
libopen-rte.so.0 => /usr/lib/libopen-rte.so.0 (0x00007f2bceed3000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f2bcecb5000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2bd22fc000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f2bcea9f000)
libopen-pal.so.0 => /usr/lib/libopen-pal.so.0 (0x00007f2bce847000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f2bce643000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f2bce43f000)

Всего наилучшего.

Ответы [ 2 ]

1 голос
/ 26 июля 2011

Видение 60% / 40% ничего не говорит, возможно, обработка учитывается иначе. Единственным интересным показателем здесь будет сравнение времени полного выполнения вашего кода на настенных часах.

Кроме того, я думаю, что (если это так) распараллеливается не ваш двоичный файл, а библиотеки MPI. Чтобы убедиться, что вам придется не только скомпилировать код на другом компьютере, но и связать его статически. Только тогда вы можете быть уверены, что вы выполняете точно такой же двоичный код во всех его аспектах на другом компьютере.

Кроме того, вы также не можете быть уверены, что библиотека MPI не использует C ++ под капотом. Я помню, что одной из библиотек MPI было довольно сложно (не помню, какая именно) договориться не компилировать против интерфейса C ++, даже если вы выполняли только C.

1 голос
/ 26 июля 2011

Возможно ли, что вы используете эту функцию?http://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html

в основном, некоторые стандартные библиотечные подпрограммы имеют параллельные реализации. Однако, он включается только когда определен макрос _GLIBCXX_PARALLEL.

...