Russian Qt Forum
Ноябрь 22, 2024, 23:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: Как в Qt Creator включить поддержку OpenMP?  (Прочитано 63106 раз)
maxwellcut
Гость
« Ответ #15 : Март 14, 2010, 21:56 »

Нет, это не та ошибка, про которую вы думаете. Стоит закомментить #pragmа omp parallel как все нормально работает
Записан
zlogic
Гость
« Ответ #16 : Март 14, 2010, 21:58 »

Нет, это не та ошибка, про которую вы думаете. Стоит закомментить #pragmа omp parallel как все нормально работает
А это debug или release версия?
Записан
maxwellcut
Гость
« Ответ #17 : Март 15, 2010, 12:38 »

Все, спасибо всем, кто уделил мне время и помог разобраться. У меня все заработало
Записан
SABROG
Гость
« Ответ #18 : Март 17, 2010, 02:47 »

На всякий случай для тех, кто не знает. Классы модуля QtConcurrent делают тоже самое, что и OpenMP. И скорее всего вариант использовать QtConcurrent более предпочтителен с точки зрения переносимости.
Записан
BRE
Гость
« Ответ #19 : Март 17, 2010, 09:28 »

На всякий случай для тех, кто не знает. Классы модуля QtConcurrent делают тоже самое, что и OpenMP. И скорее всего вариант использовать QtConcurrent более предпочтителен с точки зрения переносимости.
Разве?
А как можно без поддержки компилятора распараллелить цикл по нескольким потокам?
Насколько я представляю, QtConcurrent может выполнить функцию в отдельном потоке, но OpenMP предназначен для другого.
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Март 17, 2010, 12:25 »

На всякий случай для тех, кто не знает. Классы модуля QtConcurrent делают тоже самое, что и OpenMP. И скорее всего вариант использовать QtConcurrent более предпочтителен с точки зрения переносимости.
Эти 2 вещи "имеют нечто схожее" - но не более того. QtConcurrent::map может рассматриваться как аналог #pragma omp parallel for. Однако когда надо выжимать скорость - увы, результат совсем не в пользу QtConcurrent. Остальных возможностей QtConcurrent вообще не имеет, и нельзя его в этом обвинять, т.к. он не поддерживается компилятором. Напр. QuickSort реализуется на OpenMP, а с QtConcurrent не видно даже подходов. Что касается "реализации без импользования низкоуровневых примитивов" (как написано в документации) то это хорошо для простых случаев. Но если углубиться "чуть дальше в лес" то блокировки/синхронизации все равно возникают и придется использовать Qt мутексы и семафоры, которые заметно уступают OpenMP аналогам.
Записан
SABROG
Гость
« Ответ #21 : Март 17, 2010, 23:32 »

Разве?
А как можно без поддержки компилятора распараллелить цикл по нескольким потокам?
Насколько я представляю, QtConcurrent может выполнить функцию в отдельном потоке, но OpenMP предназначен для другого.
Для отдельного потока существует QThread, а QtConcurrent позволяет распараллеливать задачи по ядрам процессора, ну и тоже умеет создавать дополнительные потоки.

Эти 2 вещи "имеют нечто схожее" - но не более того. QtConcurrent::map может рассматриваться как аналог #pragma omp parallel for. Однако когда надо выжимать скорость - увы, результат совсем не в пользу QtConcurrent. Остальных возможностей QtConcurrent вообще не имеет, и нельзя его в этом обвинять, т.к. он не поддерживается компилятором. Напр. QuickSort реализуется на OpenMP, а с QtConcurrent не видно даже подходов. Что касается "реализации без импользования низкоуровневых примитивов" (как написано в документации) то это хорошо для простых случаев. Но если углубиться "чуть дальше в лес" то блокировки/синхронизации все равно возникают и придется использовать Qt мутексы и семафоры, которые заметно уступают OpenMP аналогам.
Хотелось бы посмотреть на пример реализации одной и той же задачи обоими способами. Я с OpenMP не работал, может выложит кто-нибудь сравнение с реальными цифрами? В чем проблема QuickSort одновременно запускать на двух ядрах? Для этого не нужна поддержка со стороны компилятора, достаточно функций, которые предоставляет ОС.
Записан
BRE
Гость
« Ответ #22 : Март 17, 2010, 23:36 »

Для отдельного потока существует QThread, а QtConcurrent позволяет распараллеливать задачи по ядрам процессора, ну и тоже умеет создавать дополнительные потоки.
Разные задачи по разным потокам.
Но насколько мне известно, она не может распараллелить одну задачу на несколько ядер. Не?
Записан
SABROG
Гость
« Ответ #23 : Март 18, 2010, 00:14 »

Для отдельного потока существует QThread, а QtConcurrent позволяет распараллеливать задачи по ядрам процессора, ну и тоже умеет создавать дополнительные потоки.
Разные задачи по разным потокам.
Но насколько мне известно, она не может распараллелить одну задачу на несколько ядер. Не?

Если имеется ввиду какая-то сложная формула, где нет циклов/итераций, массивов с индексами и эту формулу ну никак не разбить на несколько подзадач даже теоретически, то нет.

Если же задачей считать некий блок, который постоянно вызывается над разными данными, то не вопрос, просто каждый процессор будет обрабатывать свой диапозон значений.
Записан
BRE
Гость
« Ответ #24 : Март 18, 2010, 07:22 »

Если имеется ввиду какая-то сложная формула, где нет циклов/итераций, массивов с индексами и эту формулу ну никак не разбить на несколько подзадач даже теоретически, то нет.

Если же задачей считать некий блок, который постоянно вызывается над разными данными, то не вопрос, просто каждый процессор будет обрабатывать свой диапозон значений.
Поэтому, IMHO и нельзя сказать, что QtConcurrent и OpenMP делает тоже самое.  Подмигивающий
Записан
SABROG
Гость
« Ответ #25 : Март 18, 2010, 10:25 »

Поэтому, IMHO и нельзя сказать, что QtConcurrent и OpenMP делает тоже самое.  Подмигивающий

Я не нашел примеров на OpenMP, где бы не циклическая задача распараллеливалась по ядрам. Почти везде for(). Если OpenMP может распределить длинную портянку линейного кода без входных параметров по ядрам, то я бы хотел на это посмотреть. Если сравнивать многоядерность с конвеером процессора, то некоторые задачи просто физически никак не распараллелить, например если результат иснтрукции зависит от другой инструкции. В длинных формулах может быть как раз такая ситуация. Что не может распараллелить процессор - не может распараллелить и человек, будь у тебя хоть 100 ядер.
Записан
BRE
Гость
« Ответ #26 : Март 18, 2010, 10:32 »

Я не нашел примеров на OpenMP, где бы не циклическая задача распараллеливалась по ядрам. Почти везде for(). Если OpenMP может распределить длинную портянку линейного кода без входных параметров по ядрам, то я бы хотел на это посмотреть. Если сравнивать многоядерность с конвеером процессора, то некоторые задачи просто физически никак не распараллелить, например если результат иснтрукции зависит от другой инструкции. В длинных формулах может быть как раз такая ситуация. Что не может распараллелить процессор - не может распараллелить и человек, будь у тебя хоть 100 ядер.
Конечно не сможет.
Я про это и говорю, что это два абсолютно разных подхода к распараллеливанию и сравнивать их, IMHO, никак нельзя.
Записан
SABROG
Гость
« Ответ #27 : Март 18, 2010, 10:35 »

Я про это и говорю, что это два абсолютно разных подхода к распараллеливанию и сравнивать их, IMHO, никак нельзя.
Если OpenMP не сможет и QtConcurrent не сможет, а циклы оба смогут то какая разница?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #28 : Март 18, 2010, 10:43 »

В чем проблема QuickSort одновременно запускать на двух ядрах?
В том что QuickSort алгоритм рекурсивный  Улыбающийся

Хотелось бы посмотреть на пример реализации одной и той же задачи обоими способами. Я с OpenMP не работал, может выложит кто-нибудь сравнение с реальными цифрами?
С удовольствием поддержу эту инициативу, мне сделать на OpenMP нетрудно. А вот реализация на QtConcurrent - это уж Ваша забота. Давайте определим задачу, число итераций и.т.п. Конечно, нужны разумные тестовые вычисления (без тонны специфики)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #29 : Март 18, 2010, 11:07 »

Если OpenMP не сможет и QtConcurrent не сможет, а циклы оба смогут то какая разница?
Никто не будет за программиста распараллеливать, но разница может быть очень ощутима. Если каждой нитке дается задача на секунды - то кто ж спорит, QtConcurrent использовать куда как приятнее. Но вот у меня "единица вычислений" миллисекунды и тут все "детали реализации" становятся очень важны. То же и с числом вычислений на цикл: если их там миллион - то любая реализация хороша. А вот если всего 100-200 - тогда с 2 процессорами можно получить медленнее чем с одним. Ну и конечно, цикл - далеко не все что есть в OpenMP.

Это как пила и топор - да, оба предназначены для заготовки дров. Но инструменты разные  Улыбающийся
Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 23.