Я запускаю свой код в самых разных обстоятельствах, что привело к тому, что я считаю странным поведением. Мое тестирование было на двухъядерном процессоре Intel xeon с HT.
Нет инструкции OpenMP '#pragma', общая продолжительность выполнения = 507 секунд
С оператором OpenMP '#pragma', определяющим 1 ядро, общая продолжительность выполнения = 117 секунд
С оператором OpenMP '#pragma', определяющим 2 ядра, общая продолжительность выполнения = 150 секунд
С оператором OpenMP '#pragma', определяющим 3 ядра, общая продолжительность выполнения = 157 секунд
С оператором OpenMP '#pragma', определяющим 4 ядра, общая продолжительность выполнения = 144 секунды
Я думаю, что я не могу понять, почему комментирование моей строки openmp заставляет программу замедлять так много между 1 потоком без openmp и 1 нить WITH openmp.
Все, что я изменяю, находится между:
//#pragma omp parallel for shared(segs) private(i, j, p_hough) num_threads(1) schedule(guided)
and...
#pragma omp parallel for shared(segs) private(i, j, p_hough) num_threads(1,2,3,4) schedule(guided)
В любом случае, если кто-нибудь знает, почему это может происходить, сообщите мне!
Спасибо за любую помощь,
Бретт
EDIT: я рассмотрю некоторые комментарии здесь.
Я использую num_threads (1), num_threads (2) и т.д.
С дальнейшим исследованием выясняется, что мои результаты непоследовательны в зависимости от того, включена ли в код строка "расписание (руководство)".
-Когда я использую график (ориентированный), я генерирую самое быстрое решение, независимо от количества потоков. -Когда я использую планировщик по умолчанию, мои результаты значительно медленнее и разные значения -При улучшении графика (ориентированного) не достигается увеличение потоков - Без графика (с учетом) я получаю улучшение с добавлением потоков
Я думаю, что не нашел достаточно подробного описания того, что для меня делает график (ориентированный), я понимаю, что он пытается разбить цикл так, чтобы сначала выполнялись самые длительные итерации, которые должны иметь эффект наименьшего количества времени, в течение которого один поток ожидает, что остальные завершат свои итерации.
Похоже, что для моего цикла итерации ~ 900, когда я использую расписание (управляемый), я обрабатываю только 200 итераций, где, как и без графика (с инструкцией), я обрабатываю все 900 итераций. Любые мысли?