Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
31
Добавлен:
19.04.2015
Размер:
145.26 Кб
Скачать

Корректно:

int* arr = new int[10]; for(int i = 0; i < 10; i++)

arr[i] = i;

#pragma omp parallel for ordered for (int i = 1; i < 10; i++)

{

#pragma omp ordered arr[i] = arr[i - 1];

}

for(int i = 0; i < 10; i++) printf("\narr[%d] = %d", i, arr[i]);

Программа выведет нули.

Лекция 9. Захарова И.Г., Кафедра ПО

21

 

Ошибки производительности

(программа работает корректно, но неэффективно)

Лишняя директива flush

Директива выполняется по умолчанию:

В директиве barrier

При входе и при выходе из параллельной секции директивы critical

При входе и при выходе из параллельной секции директивы ordered

При входе и при выходе из параллельной секции директивы parallel

При выходе из параллельной секции директивы for

При выходе из параллельной секции директивы sections

При выходе из параллельной секции директивы single

При входе и при выходе из параллельной секции директивы parallel for

При входе и при выходе из параллельной секции директивы parallel sections

Поэтому дополнительно ее вызывать не надо!

22

Лекция 9. Захарова И.Г., Кафедра ПО

Использование critical вместо atomic

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

директиву желательно применять для защиты общей памяти при элементарных операциях:

x binop= expr x++

++x x--

--x

binop: +, *, -, /, &, ^, |, <<, или >>.

Лекция 9. Захарова И.Г., Кафедра ПО

23

Лишняя защита от одновременной записи

Любая защита памяти от одновременной записи (atomic, critical) замедляет выполнение программы.

Без необходимости эту защиту лучше не использовать.

Переменную не нужно защищать от одновременной записи если она:

является локальной для треда;

участвует в выражении firstprivate, private или lastprivate;

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

в параллельной секции директивы master или директивы single.

Лекция 9. Захарова И.Г., Кафедра ПО

24

Злоупотребление критическими секциями

1.Из-за критических секций треды ждут друг друга, что уменьшает приращение производительности за счет распараллеливания.

2.На вход в критические секции и на выход из них также тратится время.

Не надо ими злоупотреблять.

В критические секции не рекомендуется

помещать:

вызовы сложных функций (нужна их декомпозиция),

код, не работающий с общими переменными, объектами или ресурсами.

Лекция 9. Захарова И.Г., Кафедра ПО

25

Пример – сокращение входов в критические секции Неэффективно: Эффективно :

#pragma omp parallel for for ( i = 0 ; i < N; ++i )

{

#pragma omp critical

{

if (arr[i] > max) max = arr[i];

}

}

#pragma omp parallel for for ( i = 0 ; i < N; ++i )

{

#pragma omp flush(max) if (arr[i] > max)

{

#pragma omp critical

{

if (arr[i] > max) max = arr[i];

}

}

}

Если вынести условие из критической секции, вход в нее будет производиться далеко не во всех итерациях цикла.

Лекция 9. Захарова И.Г., Кафедра ПО

26

 

Соседние файлы в папке Параллельное программирование (лекции)