Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OpenMP 
:(
    Опции темы
User008
Дата 14.9.2010, 05:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 306
Регистрация: 9.9.2009

Репутация: 1
Всего: 1



Функция создаёт объект и возвращает указатель на него. Когда все нужные объекты сделаны, возвращается 0.
Код

while (p = next_object())
{
    ....
}


Обработка одного объекта не зависит от результата обработки других объектов. Как их можно обработать параллельно?

Это сообщение отредактировал(а) User008 - 14.9.2010, 05:02
PM MAIL   Вверх
W4FhLF
Дата 14.9.2010, 06:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Прежде всего функция next_object() должна быть thread-safe, ну и соответственно учитывать, что к ней идёт обращение из разных потоков. А далее всё просто, что-то вроде:

Код

#pragma omp parallel num_threads(omp_get_thread_num())
   {
      while (p = next_object())
      {
          ....
      }
   }


Цикл будет исполняться параллельно с количеством потоков равным количеству ядер (хотя это зависит от реализации OpenMP, но для Visual C++ это так).


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
User008
Дата 14.9.2010, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 306
Регистрация: 9.9.2009

Репутация: 1
Всего: 1



Цитата(W4FhLF @ 14.9.2010,  06:38)
Прежде всего функция next_object() должна быть thread-safe, ну и соответственно учитывать, что к ней идёт обращение из разных потоков. А далее всё просто, что-то вроде:

Код

#pragma omp parallel num_threads(omp_get_thread_num())
   {
      while (p = next_object())
      {
          ....
      }
   }


Цикл будет исполняться параллельно с количеством потоков равным количеству ядер (хотя это зависит от реализации OpenMP, но для Visual C++ это так).

Не знаю является ли функция thread-safe, поскольку не знаю как это проверить. Но программа в этом месте стала ломаться. А в дебажной версии перед этим появляется сообщение argument to num_threads clause must be positive.
PM MAIL   Вверх
bsa
Дата 14.9.2010, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(User008 @  14.9.2010,  16:15 Найти цитируемый пост)
Не знаю является ли функция thread-safe, поскольку не знаю как это проверить. 
Обычно, в документации это пишут. Если же не написано или написано, что она не "потокобезопасная", то тебе нужно для нее сделать "обертку", которая будет гарантировать потокобезопасность (читай про мьютексы или про критические секции, если пишешь на WinAPI).

PM   Вверх
W4FhLF
Дата 14.9.2010, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Цитата(User008 @  14.9.2010,  15:15 Найти цитируемый пост)
Не знаю является ли функция thread-safe, поскольку не знаю как это проверить. Но программа в этом месте стала ломаться. А в дебажной версии перед этим появляется сообщение argument to num_threads clause must be positive.


Про thread-safe отдельная тема. Тут в одном посте не изложишь. Грубо говоря, если эта функция создаёт объект, то его создание не должно прерываться, а это вполне вероятно в случае многопоточного приложения. Как правильно заметил ув. bsa для этого используются элементы синхронизации, такие как мьютексы и критические секции. 
По поводу сообщения, поставь просто в скобки вместо вызова omp_get_thread_num() число равное числу твоих ядер (например, 2). Ну и вообще, почитай чтоли про OpenMP и осознай поведения кода в этом месте, а то я же не проверял то, что написал. smile

Это сообщение отредактировал(а) W4FhLF - 14.9.2010, 15:51


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
User008
Дата 15.9.2010, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 306
Регистрация: 9.9.2009

Репутация: 1
Всего: 1



--

Это сообщение отредактировал(а) User008 - 15.9.2010, 00:58
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0456 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.