![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Thunderbolt |
|
|||
![]() DevRel ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 7.11.2007 Где: Тула Репутация: 10 Всего: 16 |
32 подводных камня OpenMP при программировании на Си++
Аннотация. С распространением многоядерных систем задача параллельного программирования становится все более и более актуальной. Данная область, однако, является новой даже для большинства опытных программистов. Существующие компиляторы и анализаторы кода позволяют находить некоторые ошибки, возникающие при разработке параллельного кода. Многие ошибки никак не диагностируются. В данной статье приводится описание ряда ошибок, приводящих к некорректному поведению параллельных программ, созданных на основе технологии OpenMP. --------------------
Карпов Андрей, DevRel в PVS-Studio. |
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
Thunderbolt, спасибо за хорошую статью. Очень качественный обзор.
Для меня оказалось новым следующее :
Означает ли это, что на выходе из parallel, for или section в случаях когда синхронизировать по сути нечего (все данные - shared), синхронизация всё-равно будет производиться? Если да, то можно ли её избежать, указав в качестве параметра какую-нибудь одну "фиктивную" переменную? -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
| Thunderbolt |
|
|||
![]() DevRel ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 7.11.2007 Где: Тула Репутация: 10 Всего: 16 |
Согласно спецификации OpenMP, flush неявно выполняется во всех перечисленных Вами случаях. Избежать этой встроенной задержки можно в директивах for и sections, используя выражение nowait, которое именно для этого и предназначено (см. описание flush и nowait в спецификации). Однако, отменить синхронизацию на выходе из parallel нельзя. Более того, это именно тот случай, когда ее отменять не следует, поскольку это (если бы было возможно) могло бы привести к неожиданным результатам. И напоследок замечание по поводу предложенного обходного пути (использование flush с другой переменной). Это ничего не даст, потому что дополнительная директива flush не отменит неявной синхронизации, встроенной в другие директивы. Эта ошибка, собственно, описана в статье, она называется "Ненужная директива flush". --------------------
Карпов Андрей, DevRel в PVS-Studio. |
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
Да, nowait, точно! Спасибо!
-------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |