Вопрос по c++ – Как определить, работает ли OpenMP?

9

Я пытаюсь запустить LIBSVM в параллельном режиме, но мой вопрос в целом в OpenMP. В соответствии сLIBSVM FAQЯ изменил код с помощью вызовов #pragma для использования OpenMP. Я также изменил Makefile (для un * x), добавив аргумент -fopenmp, чтобы он стал:

CFLAGS = -Wall -Wconversion -O3 -fPIC -fopenmp

Код хорошо компилируется. Я проверяю (поскольку это не мой компьютер), установлен ли OpenMP:

/sbin/ldconfig -p | grep gomp

и увидеть, что он, вероятно, установлен:

 libgomp.so.1 (libc6,x86-64) => /usr/lib64/libgomp.so.1
 libgomp.so.1 (libc6) => /usr/lib/libgomp.so.1

Сейчас; когда я запускаю программу, я не вижу каких-либо улучшений скорости. Кроме того, когда я проверяю с помощью "top" процесс использует не более 100% ЦП (имеется 8 ядер), также нет узких мест ЦП (только еще один пользователь с использованием 100% ЦП), я ожидал увидеть более 100% (или другой индикатор) этот процесс использует несколько ядер.

Есть ли способ проверить, что работает многоядерный?

нет, когда используются многоядерные системы (по крайней мере, при установке на моем сервере), мы видим значения, намного превышающие 100% paul simmons
Просто мысль, но не должно быть макс. 100% / количество ядер, когда работает только один поток? Tibor
@Tibor, top по умолчанию - режим Irix, который показывает 100% для полной загрузки одного ЦП и n * 100% для полной загрузки n ЦП. Если вы выключаете режим Irix (нажимаете «I»), он показывает 100%, когда используются все процессоры. Hristo Iliev

Ваш Ответ

2   ответа
1

Сomp_get_max_threads() вы получите максимальное количество потоков, доступных для вашей программы. Это также максимум всех возможных возвращаемых значенийomp_get_num_threads(), Вы можете явно установить количество потоков, которые будут использоваться вашей программой, с помощью переменной средыOMP_NUM_THREADSнапример, в Баш через

$export OMP_NUM_THREADS=8; your_program
Попробовал - получен "неожиданный конец файла" и количество протекторов 512
8

Вы можете использовать функциюomp_get_num_threads(), Он вернет вам количество потоков, используемых вашей программой.

Надо позвонитьomp_get_num_threads() внутри параллельной области. В противном случае всегда возвращается 1!

Похожие вопросы