OpenMP тормозит?
От: sof.bix Россия http://byterix.net
Дата: 02.10.08 14:41
Оценка:
Используя собственно данную технологию натолкнулся на его особенность или собственную глупость, что и хотел выяснить. Были ли у кого проблемы с ней?
У меня скорость сильно падает по отношению с нераспараллеленой версией кода пи запуске 8 процессов на 4-ядерной архитектуре.

Цикл самый обычный:
#ifdef _OPENMP
procsCount = omp_get_num_procs();
#pragma omp parallel for num_threads(procsCount), schedule(dynamic) 
#endif // _OPENMP
for ( int y = 0; y < dstHeight; y++ )
{
  setResizePixel(Img, y, dstWidth, scaley, scalex, Dst);
}


В чем может быть дело?

Да еще возникала проблема №26 из отсюдова
Автор(ы): Алексей Колосов, Евгений Рыжков, Андрей Карпов
Дата: 26.08.2008
С распространением многоядерных систем задача параллельного программирования становится все более и более актуальной. Данная область, однако, является новой даже для большинства опытных программистов.
Существующие компиляторы и анализаторы кода позволяют находить некоторые ошибки, возникающие при разработке параллельного кода. Многие ошибки никак не диагностируются. В данной статье приводится описание ряда ошибок, приводящих к некорректному поведению параллельных программ, созданных на основе технологии OpenMP.

Хотя все было корректно... Пришлось все что было локализовано в распараллеливаемом цикле перевести в процедуру setResizePixel тогда проблемы не стало. Чья глюкоза?
Re: OpenMP тормозит?
От: remark Россия http://www.1024cores.net/
Дата: 02.10.08 18:11
Оценка:
Здравствуйте, sof.bix, Вы писали:

SB>Используя собственно данную технологию натолкнулся на его особенность или собственную глупость, что и хотел выяснить. Были ли у кого проблемы с ней?

SB>У меня скорость сильно падает по отношению с нераспараллеленой версией кода пи запуске 8 процессов на 4-ядерной архитектуре.

SB>Цикл самый обычный:

SB>
SB>#ifdef _OPENMP
SB>procsCount = omp_get_num_procs();
SB>#pragma omp parallel for num_threads(procsCount), schedule(dynamic) 
SB>#endif // _OPENMP
SB>for ( int y = 0; y < dstHeight; y++ )
SB>{
SB>  setResizePixel(Img, y, dstWidth, scaley, scalex, Dst);
SB>}
SB>


SB>В чем может быть дело?


Что в функции setResizePixel()?
И как объявлены все используемые переменные?

SB>Да еще возникала проблема №26 из отсюдова
Автор(ы): Алексей Колосов, Евгений Рыжков, Андрей Карпов
Дата: 26.08.2008
С распространением многоядерных систем задача параллельного программирования становится все более и более актуальной. Данная область, однако, является новой даже для большинства опытных программистов.
Существующие компиляторы и анализаторы кода позволяют находить некоторые ошибки, возникающие при разработке параллельного кода. Многие ошибки никак не диагностируются. В данной статье приводится описание ряда ошибок, приводящих к некорректному поведению параллельных программ, созданных на основе технологии OpenMP.

SB>Хотя все было корректно... Пришлось все что было локализовано в распараллеливаемом цикле перевести в процедуру setResizePixel тогда проблемы не стало. Чья глюкоза?

Не понятно, как может возникнуть проблема №26, если всё корректно. Она может возникнуть только если программа написана *НЕ* корректно.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: OpenMP тормозит?
От: sof.bix Россия http://byterix.net
Дата: 03.10.08 06:03
Оценка:
Здравствуйте, remark, Вы писали:

R>Что в функции setResizePixel()?

R>И как объявлены все используемые переменные?


static int Resize(const CRawImage & Img,
                            float const scalex, float const scaley,
                            CRawImage & Dst)
    {
        int dstWidth = (int)((Img.getWidth()+0.5f)/scalex-0.5f);
        int dstHeight = (int)((Img.getHeight()+0.5f)/scaley-0.5f);
        Dst.CreateImage(dstHeight, dstWidth, Img.isGrayScale());
#ifdef _OPENMP
    #pragma omp parallel for num_threads(procsCount), schedule(dynamic) 
#endif // _OPENMP
        for ( int y = 0; y < dstHeight; y++ )
        {
            setResizePixel(Img, y, dstWidth, scaley, scalex, Dst);
        }
        return 0;
    }

static void setResizePixel(const CRawImage & Img, int y, int dstWidth, 
        float const scaley, float const scalex, CRawImage & Dst)
    {
        float oldY = (y+0.5f)*scaley-0.5f;
        for ( int x = 0; x < dstWidth; x++ )
        {
            float oldX = (x+0.5f)*scalex-0.5f;
            CRawColor color;
            GetAreaColorInterpolated(Img, oldX, oldY, scalex, scaley, color);
            Dst.setRawColor(x,Dst.getHeight() - y - 1, color);
        }
    }

static inline void GetAreaColorInterpolated(const CRawImage & InImg,
                                  float const xc, float const yc, 
                                  float const w, float const h, 
                                  CRawColor & color)




R>Не понятно, как может возникнуть проблема №26, если всё корректно. Она может возникнуть только если программа написана *НЕ* корректно.


Кароче тесты начали проходить когда грубо говоря все локальные переменные были ограничены стеком вызываемой функции. Почему такое возможно?
Re[3]: OpenMP тормозит?
От: remark Россия http://www.1024cores.net/
Дата: 03.10.08 08:00
Оценка:
Здравствуйте, sof.bix, Вы писали:

SB>Здравствуйте, remark, Вы писали:


R>>Что в функции setResizePixel()?

R>>И как объявлены все используемые переменные?


SB> #pragma omp parallel for num_threads(procsCount), schedule(dynamic)


Попробуй указать schedule(dynamic, 50). chunk_size=1 это слишком мало здесь.
И может быть вообще другие типы schedule попробовать и другие размеры chunk_size.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: OpenMP тормозит?
От: remark Россия http://www.1024cores.net/
Дата: 03.10.08 08:02
Оценка:
Здравствуйте, sof.bix, Вы писали:

SB>Здравствуйте, remark, Вы писали:


R>>Что в функции setResizePixel()?

R>>И как объявлены все используемые переменные?


SB> Dst.setRawColor(x,Dst.getHeight() — y — 1, color);


Матрица в массиве хранится? По строчкам?


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: OpenMP тормозит?
От: sof.bix Россия http://byterix.net
Дата: 03.10.08 08:10
Оценка:
Здравствуйте, remark, Вы писали:


SB>> Dst.setRawColor(x,Dst.getHeight() — y — 1, color);


R>Матрица в массиве хранится? По строчкам?


верно, думаете замедляет?
Она выравнена по строчкам до 4-х байт.
В массиве типо unsigned char * data

R>
Re[4]: OpenMP тормозит?
От: sof.bix Россия http://byterix.net
Дата: 03.10.08 08:12
Оценка:
Здравствуйте, remark, Вы писали:

R>Попробуй указать schedule(dynamic, 50). chunk_size=1 это слишком мало здесь.

R>И может быть вообще другие типы schedule попробовать и другие размеры chunk_size.

schedule(dynamic, 50) — что это дает?
chunk_size=1 — что это такое?
Re[5]: OpenMP тормозит?
От: remark Россия http://www.1024cores.net/
Дата: 03.10.08 11:22
Оценка: 2 (1)
Здравствуйте, sof.bix, Вы писали:

SB>Здравствуйте, remark, Вы писали:


R>>Попробуй указать schedule(dynamic, 50). chunk_size=1 это слишком мало здесь.

R>>И может быть вообще другие типы schedule попробовать и другие размеры chunk_size.

SB>schedule(dynamic, 50) — что это дает?

SB>chunk_size=1 — что это такое?

Тут референс по типам шедулеров и их параметрам:
http://msdn.microsoft.com/en-us/library/b5b5b6eb.aspx

Тут пара тьюториалов по OpenMP, включая похожую задачу по трансформации картинки в грейскейл:
http://msdn.microsoft.com/en-us/magazine/cc163717.aspx
http://msdn.microsoft.com/en-us/magazine/cc850829.aspx


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[5]: OpenMP тормозит?
От: remark Россия http://www.1024cores.net/
Дата: 06.10.08 12:51
Оценка:
Здравствуйте, sof.bix, Вы писали:

SB>Здравствуйте, remark, Вы писали:


R>>Попробуй указать schedule(dynamic, 50). chunk_size=1 это слишком мало здесь.

R>>И может быть вообще другие типы schedule попробовать и другие размеры chunk_size.

SB>schedule(dynamic, 50) — что это дает?

SB>chunk_size=1 — что это такое?

Помогло?


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[6]: OpenMP тормозит?
От: sof.bix Россия http://byterix.net
Дата: 07.10.08 05:32
Оценка:
Здравствуйте, remark, Вы писали:

R>Помогло?


Нет. Потери в некоторых случаях даже выросли.
А что вы думаете о взаимодействии двух шедулеров (осевого и опенМП)?
Есть подозрение что при любом типе планировки потери неизбежны.
На днях попробовал просто запускать 4 процесса по 3 нити на 4-х ядрах. Потери ~3%
Re[7]: OpenMP тормозит?
От: remark Россия http://www.1024cores.net/
Дата: 07.10.08 07:50
Оценка:
Здравствуйте, sof.bix, Вы писали:

SB>Здравствуйте, remark, Вы писали:


R>>Помогло?


SB>Нет. Потери в некоторых случаях даже выросли.

SB>А что вы думаете о взаимодействии двух шедулеров (осевого и опенМП)?
SB>Есть подозрение что при любом типе планировки потери неизбежны.
SB>На днях попробовал просто запускать 4 процесса по 3 нити на 4-х ядрах. Потери ~3%

Я не очень понял, потери относительно чего? На ~3% стало медленнее отночительно чего?
Небольшой оверхед шедулер OpenMP, естественно, вносит. Например, если размер одной задачи, выделяемой потоку, равен 10'000 тактов, то оверхед может составлять как-раз ~3%.
Если размер задачи 10 тактов, то оверхед может составлять ~3000%.


Вот тут я тоже не очень понял:
"У меня скорость сильно падает по отношению с нераспараллеленой версией кода пи запуске 8 процессов на 4-ядерной архитектуре."

А при запуске 2 процессов? Ускоряется?
А при запуске 4 процессов? Ускоряется?
Т.е. именно при запуске 8 замедление?


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: OpenMP тормозит?
От: remark Россия http://www.1024cores.net/
Дата: 07.10.08 07:52
Оценка:
Здравствуйте, sof.bix, Вы писали:

SB>Используя собственно данную технологию натолкнулся на его особенность или собственную глупость, что и хотел выяснить. Были ли у кого проблемы с ней?

SB>У меня скорость сильно падает по отношению с нераспараллеленой версией кода пи запуске 8 процессов на 4-ядерной архитектуре.

Кстати, вот тут рядом ветка тоже про OpenMP, где есть подозрение, что производительность просто упирается в пропускную способность памяти:
http://www.rsdn.ru/forum/message/3127856.1.aspx
Автор: QiRiX
Дата: 06.10.08



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: OpenMP тормозит?
От: sof.bix Россия http://byterix.net
Дата: 07.10.08 08:10
Оценка:
Здравствуйте, remark, Вы писали:

R>Кстати, вот тут рядом ветка тоже про OpenMP, где есть подозрение, что производительность просто упирается в пропускную способность памяти:

R>http://www.rsdn.ru/forum/message/3127856.1.aspx
Автор: QiRiX
Дата: 06.10.08


Читал, думал... Наверное это не мой случай.
В моем как раз много математических операций на уже подготовленных данных.
Хотя постоянное перемещение по картинке (чтение массива данных) конечно вносит свою лепту.
Re[8]: OpenMP тормозит?
От: sof.bix Россия http://byterix.net
Дата: 07.10.08 08:30
Оценка:
Здравствуйте, remark, Вы писали:

R>Здравствуйте, sof.bix, Вы писали:


SB>>Здравствуйте, remark, Вы писали:


R>>>Помогло?


SB>>Нет. Потери в некоторых случаях даже выросли.

SB>>А что вы думаете о взаимодействии двух шедулеров (осевого и опенМП)?
SB>>Есть подозрение что при любом типе планировки потери неизбежны.
SB>>На днях попробовал просто запускать 4 процесса по 3 нити на 4-х ядрах. Потери ~3%

R>Я не очень понял, потери относительно чего? На ~3% стало медленнее отночительно чего?

R>Небольшой оверхед шедулер OpenMP, естественно, вносит. Например, если размер одной задачи, выделяемой потоку, равен 10'000 тактов, то оверхед может составлять как-раз ~3%.
R>Если размер задачи 10 тактов, то оверхед может составлять ~3000%.
R>Вот тут я тоже не очень понял:
R>"У меня скорость сильно падает по отношению с нераспараллеленой версией кода пи запуске 8 процессов на 4-ядерной архитектуре."

В общем сравнивалось время выполнения двух версий программы. В ней есть параллельно идущие и нераспараллеленые куски кода, выполняющиеся по одиночке примерно за 200сек. Одна была с отключеной поддержкой OpenMP, другая включеной (число потоков=числу ядер фиксированно). Запуск разных версий шел естественно последовательно, но в разных, параллельно идущих, количествах копий . 4-8. Скорость падала при количестве процессов, сравнимым с количеством ядер.

Вспомним что процессор 4-х ядерный
R>А при запуске 2 процессов? Ускоряется?
(должно быть ускоряется, но не тестировалось)
R>А при запуске 4 процессов? Ускоряется?
замедляется ~10%
R>Т.е. именно при запуске 8 замедление?
еще медленней 10-20%

А один процесс — естественно быстрее раза в три

R>


Коллективная мысль наводит что дело в Виндовом шедулере, т.е. под саляркой меньшие потери будут!?
Re[9]: OpenMP тормозит?
От: remark Россия http://www.1024cores.net/
Дата: 12.10.08 09:41
Оценка:
Здравствуйте, sof.bix, Вы писали:

SB>В общем сравнивалось время выполнения двух версий программы. В ней есть параллельно идущие и нераспараллеленые куски кода, выполняющиеся по одиночке примерно за 200сек. Одна была с отключеной поддержкой OpenMP, другая включеной (число потоков=числу ядер фиксированно). Запуск разных версий шел естественно последовательно, но в разных, параллельно идущих, количествах копий . 4-8. Скорость падала при количестве процессов, сравнимым с количеством ядер.


SB>Вспомним что процессор 4-х ядерный

R>>А при запуске 2 процессов? Ускоряется?
SB>(должно быть ускоряется, но не тестировалось)
R>>А при запуске 4 процессов? Ускоряется?
SB>замедляется ~10%
R>>Т.е. именно при запуске 8 замедление?
SB>еще медленней 10-20%

SB>А один процесс — естественно быстрее раза в три


Не понял, как X может быть больше Y на 10-20%, Y больше X на 200%


SB>Коллективная мысль наводит что дело в Виндовом шедулере, т.е. под саляркой меньшие потери будут!?


Лично я так не думаю. На хорошо написанную OpenMP программу шедулер ОС не должен влиять.
Основные 3 момента, которые обычно не дают программе масштабироваться:
1. Grain-size.
2. False-sharing.
3. Locality.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[10]: OpenMP тормозит?
От: sof.bix Россия http://byterix.net
Дата: 13.10.08 06:16
Оценка:
Здравствуйте, remark, Вы писали:

R>Не понял, как X может быть больше Y на 10-20%, Y больше X на 200%


Наверное вы не поняли потому что никогда не занимались абсурдными тестами.
Если вам ближе математика, то я постараюсь объяснить математическими терминами.
Y — кол. тактов без параллелизма. X — с параллелизмом и без (часть кода параллелиться)
Деление на 4 — означает выполнение на 4-х ядрах. Умножение на 4 означает работа в 4-х процессах.
Уровнения:
X / 4 < Y на 200% (здесь как ни крути Y будет исполняться на одном ядре а X на всех четырех)
4 * X / 4 > 4 * Y / 4 на 10-20% (здесь все выполняется на 4-х ядрах)


SB>>Коллективная мысль наводит что дело в Виндовом шедулере, т.е. под саляркой меньшие потери будут!?


R>Лично я так не думаю. На хорошо написанную OpenMP программу шедулер ОС не должен влиять.

Компилируется на MSVC 2005
R>Основные 3 момента, которые обычно не дают программе масштабироваться:
R>1. Grain-size.
R>2. False-sharing.
R>3. Locality.


R>
Re[11]: OpenMP тормозит?
От: remark Россия http://www.1024cores.net/
Дата: 13.10.08 06:49
Оценка:
Здравствуйте, sof.bix, Вы писали:

SB>Здравствуйте, remark, Вы писали:


R>>Не понял, как X может быть больше Y на 10-20%, Y больше X на 200%


SB>Наверное вы не поняли потому что никогда не занимались абсурдными тестами.

SB>Если вам ближе математика, то я постараюсь объяснить математическими терминами.
SB>Y — кол. тактов без параллелизма. X — с параллелизмом и без (часть кода параллелиться)
SB>Деление на 4 — означает выполнение на 4-х ядрах. Умножение на 4 означает работа в 4-х процессах.
SB>Уровнения:
SB>X / 4 < Y на 200% (здесь как ни крути Y будет исполняться на одном ядре а X на всех четырех)
SB>4 * X / 4 > 4 * Y / 4 на 10-20% (здесь все выполняется на 4-х ядрах)

Ровном счетом ничего не понятно.
Приведи просто 2 цифры: время выполнения нераспараллелиной версии и время выполнения [частично] распараллелиной.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[9]: OpenMP тормозит?
От: akukanov Россия  
Дата: 13.10.08 09:37
Оценка: +1
Здравствуйте, sof.bix, Вы писали:

SB>В общем сравнивалось время выполнения двух версий программы. В ней есть параллельно идущие и нераспараллеленые куски кода, выполняющиеся по одиночке примерно за 200сек. Одна была с отключеной поддержкой OpenMP, другая включеной (число потоков=числу ядер фиксированно). Запуск разных версий шел естественно последовательно, но в разных, параллельно идущих, количествах копий . 4-8. Скорость падала при количестве процессов, сравнимым с количеством ядер.


Ну а что Вы хотите? У Вас при включенном OpenMP каждый из 4-8 процессов запускает минимум 4 потока, всего имеете от 16 до 32 потока, одновременно конкурирующих за процессорное время 4-х ядер. Oversubscription, однако; как следствие — увеличение накладных расходов на переключение контекстов, а если вычисления ещё и с памятью что-то делают — значительно больше промахов по кэшу. Если OpenMP отключить — 4-8 потоков на 4 ядра, соответственно и проблем нет.

SB>Коллективная мысль наводит что дело в Виндовом шедулере, т.е. под саляркой меньшие потери будут!?


Не думаю.
А что Вы померять-то хотите, вообще?
Re: OpenMP тормозит?
От: degor Россия  
Дата: 13.10.08 21:31
Оценка: +1
Здравствуйте, sof.bix, Вы писали:

SB>Используя собственно данную технологию натолкнулся на его особенность или собственную глупость, что и хотел выяснить. Были ли у кого проблемы с ней?

SB>У меня скорость сильно падает по отношению с нераспараллеленой версией кода при запуске 8 процессов на 4-ядерном процессоре.

у интела есть VTune и Thread Profiler, которые помогут выяснить точную причину. про Thread Profiler не скажу, а у VTune есть триальная версия. эти инструменты — необходимейшая вещь для оптимизации. есть еще третий инструмент — компилятор. наверняка он поддерживает open mp лучше майкрософтовского.

про возможные причины уже сказано — промахи по кешу, гранулярность данных, затраты на синхронизацию.

кстати,

SB> Пришлось все, что было локализовано в распараллеливаемом цикле, перевести в процедуру


я думаю, будет правильно заставить работать кусок кода по месту, не вынося его в отдельную функцию. использование open mp не такая простая вещь, как кажется. интел на эту тему переодически семинары проводит.
Re[2]: OpenMP тормозит?
От: sof.bix Россия http://byterix.net
Дата: 14.10.08 06:01
Оценка:
Здравствуйте, degor, Вы писали:

SB>> Пришлось все, что было локализовано в распараллеливаемом цикле, перевести в процедуру


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


То есть искать проблему, не обращая на противоречия с компилятором?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.