2015-01-19 4 views
0

У меня есть программа openMP, где цикл for параллелен. Все работает так, как должно, за исключением того, что главный поток много, во много раз быстрее остальных потоков ... Например, при работе с 4 потоками нить 0 заканчивается задолго до других, но они выполняются одинаково кода, при почти том же объеме работы.Общие сведения openMP - скорость потока различна

Возможно ли это из-за обработки ресурсов Windows, обмена задачами в и из потоков, используемых программой, что приводит к замедлению? Или, скорее всего, мой код является проблемой? Я просто хочу, чтобы я не тратил время на поиск ошибки в моей программе, если это неизбежная проблема, вызванная ОС ...

+1

Трудно сказать, что обеспечивает плохое поведение без какого-либо реального кода. Однако, если вы хотите получить ссылку, см. Http://stackoverflow.com/questions/13355559/openmp-slower-more-than-one-threads-cant-figure-out. – user1929959

+0

Я думаю, что у меня слишком много кода, чтобы он был полезен для публикации ... Вопрос действительно в общем поведении openMP: Можно ли рассчитывать на каждый поток одинаково быстро? – MikkelSecher

+0

Если вы не потратите время на то, чтобы переделать свой код в основные элементы, не выбрасывая важные части, ваш вопрос, скорее всего, будет закрыт. –

ответ

0

Что касается приоритета потока, это может быть проблемой между временем выполнения OpenMP и ОС. Какой компилятор вы используете? Как вы измеряете, когда заканчиваются нити?

Чтобы улучшить производительность вашей параллельной OpenMP, в этом случае я бы использовал политику динамического планирования с помощью директивы schedule. Если основной поток получает больше циклов от CPU, в этом случае также будет работать больше. В общем, вы не можете рассчитывать на то, что каждый поток будет одинаково быстрым, но если вы наблюдаете различия по порядку величины, это звучит как плохое столкновение между временем выполнения и ОС.

+0

Спасибо, это был ответ, который я искал ... Оказалось, что после некоторых экспериментов стало ясно, что чем меньше процессов, выполняющихся в ОС в фоновом режиме, тем больше равны потокам. При использовании всех доступных ядер один из потоков всегда значительно медленнее. Я проведу это на узле на узле суперкомпьютера с 32 ядрами и посмотрю, не отличается ли производительность более однородной, когда она не запускает большую операционную систему, используя кучу ресурсов. – MikkelSecher

+0

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

0

Посмотрите, что выполнение потока зависит от многих факторов, поэтому может быть много возможностей например, существует ли какой-либо механизм блокировки или нет или доступность ресурсов, например, когда поток завершает работу, он должен освобождать ресурсы. Существует еще много факторов. Поэтому я предлагаю использовать инструмент vtune и профиль вашего кода, он даст вам четкое представление о том, где ваш поток тратит время и почему. Я надеюсь, что это помогает.

Смежные вопросы