Скомпилирован с g++ -fopenmp . Он может правильно распечатать, что у меня 4 процессора, но все тестовые функции работают на thread 0 . Я попытался изменить OMP_NUM_THREADS . Но это также не влияет. У меня было все так же, как в онлайн-примерах, но почему бы мне не заставить его работать?
Eines He 18 апр. 2012, в 08:34
Поделиться
Откуда ты знаешь, что он запускает только один поток?
Antoine 18 апр. 2012, в 06:25
Да, я проверил в test (), распечатав omp_get_thread_num ().
Eines He 18 апр.
2012, в 17:19
Вы проверяли omp_get_max_threads() чтобы увидеть, если openmp что-то может использовать только один поток по какой-то причине?
Grizzly 18 апр. 2012, в 17:27
Спасибо, я проверил omp_get_max_threads () в test (), и он равен 4. Но все-таки каждый test () выполняется в потоке с номером 0.
Eines He 18 апр. 2012, в 17:49
Возможно ли, что компилятор оптимизирует все циклы, поскольку они ничего не делают, и тогда каждый поток завершается быстрее, чем цикл, создающий их, может работать, поскольку они ничего не делают . так что существует только один поток Бег. Просто теория, наверное, неверная 🙂
How to enable Openmp setting in DevC++ | step by step
jcoder 14 май 2013, в 16:36
Попробуйте #pragma omp parallel for schedule(static) num_threads(4) . Статическое планирование является де-факто по умолчанию, но не обязательно по умолчанию.
Z boson 04 авг. 2014, в 07:29
Показать ещё 4 комментария
Поделиться:
multithreading
5 ответов
Ваша проблема здесь:
#pragma omp parallel for num_thread(4)
Правильное предложение num_threads(4) , а не num_thread(4) . Неправильные прагмы openmp игнорируются, и вы закончили с последовательной программой.:)
Я удивлен, что вы не получили предупреждение о компиляторе, потому что я это сделал.
Tudor 18 апр. 2012, в 20:59
Поделиться
Спасибо и извините, это была опечатка. В коде у меня было это num_threads (4), но все еще не везет
Eines He 19 апр. 2012, в 15:38
Tudor 19 апр. 2012, в 15:39
Как вы настраиваете свою среду? Я думаю, что код довольно простой и не может пойти не так. Я использую g ++ 4.6.1 и libomp1. Я думаю, что openmp определенно работает, потому что у меня нет проблем с проверкой количества процессоров . и т. Д. Это должно быть то, где я не правильно установил среду.
Eines He 20 апр. 2012, в 04:59
Хм . Я проверял это на Windows с cl.exe. Я протестирую его в своей среде Linux как можно скорее и сообщу вам.
Tudor 20 апр. 2012, в 07:49
Итак, я проверил на Ubuntu с G ++ 4.5.2, и он также отлично работает там.
Tudor 20 апр. 2012, в 09:26
Показать ещё 3 комментария
У меня была эта проблема в visual studio, и, наконец, я понял, что забыл включить поддержку Open MP в visual studio. Это не дало мне никакой ошибки, но выполнило программу только для одного потока
hamed246 02 авг. 2014, в 15:08
Поделиться
Daniel Katz 27 окт. 2014, в 18:08
Сэкономил мое время Спасибо.
EAMax 29 нояб. 2018, в 19:14
сначала выберите проект _> свойства → c/c++ → язык → поддержка open mp → выберите да, а затем вы найдете выше режим соответствия (сделайте его нет)
Вводная — Параллельные(многопоточные) вычисления в OpenMP и C++17.
abdelhamed 21 апр. 2019, в 12:18
Поделиться
Я столкнулся с той же ситуацией на рабочем столе ubuntu, когда я расширяю модуль numpy с помощью кода C. openmp работает только с одним потоком. Мне удалось удалить базу libopenblas и установить libatlas-base-dev. (Для решения проблемы с установкой numpy) Затем многопоточность openmp вернулась:)
Я тестировал его на сервере ubuntu с 64 ядрами, и он работает так же, как мой рабочий стол! Я думаю, это связано с тем, что libopenblas конфликтует с библиотеками, такими как атлас.
GBY 06 май 2013, в 19:21
Поделиться
используйте функцию omp_set_num_threads (4) перед вызовом параллельной секции omp.
также, как вы определяете количество потоков? вставляйте свои printfs в критический раздел, чтобы удостовериться, что все печатается.
prathmesh.kallurkar 18 апр. 2012, в 07:59
Поделиться
Ещё вопросы
- 0 Select2 не позволяет разблокировать раскрывающийся список
- 1 Как сделать запрос к инвертированному индексу с нефиксированным количеством ключевых слов?
- 0 Используя библиотеку PHP Podio, не могу получить данные рейтинга через PodioItem :: get ($ id)
- 1 MVC Linq OrderBy не сохраняется в Razor View
- 0 Индекс не непрерывного массива
- 0 Как спроектировать режим отображения с окна на полноэкранный режим без окон во время выполнения?
- 0 c ++ читает из файла и совпадает с идентификатором
- 1 Ошибка аутентификации SAML в Python AWS Boto3
- 0 Angular UI-Router вложенные представления
- 1 Как я могу узнать, совершают ли пользователи повторные посещения?
- 0 Функция заголовка php перенаправляет только на локальные страницы
- 1 OpenCSV CSVReader UTF-8 кодировка
- 1 Есть ли способ получить URI изображения сразу после его удаления из внешнего хранилища?
- 1 Android Kotlin — пойманное исключение, по-прежнему вылетает программа
- 0 Chrome DevTools игнорирует изображение с «facebook» в имени файла
- 1 Почему у меня есть 3 темы здесь?
- 0 Почему не работает моя функция printLevel?
- 0 Safari 6 выпуск с максимальной шириной на столах
- 0 Переадресация вкладок плагинов с первой вкладки на вторую
- 1 Как вернуть идентификатор столбца, который содержит минимальное значение в 2-D массиве (Java)
- 1 Сброс порядковых номеров акцептора в качестве инициатора без возможности использования onLogon
- 1 Панды read_csv для gziped файла не выводят числовые типы столбцов
- 1 Совпадение строки между двумя символами регулярное выражение
- 0 Как получить доступ к методу класса, который является закрытым членом другого класса
- 0 doctrine2, получить связанные данные с обратной стороны
- 1 Десериализация дат в формате dd / MM / yyyy в Списке с использованием Json.Net
- 0 Как использовать Spring Restful веб-сервис, используя $ ресурс в Angularjs
- 1 Используйте разные поля для проверки в ASP.NET Identity
- 1 Отбор проб в тензорном потоке
- 0 Нет подходящей функции для вызова c ++
- 1 Как получить доступ к команде Linux, такой как sed, awk из Java
- 0 PHP эквивалентен свойству JavaScript parentNode
- 1 Объект не имеет атрибута — Имя переменной, совместно используемой классами
- 1 Как запустить новый файл Node.js после того, как уже был запущен какой-либо другой файл Node.js. на компьютере с Windows 10?
- 0 Статическая инициализация члена класса шаблона
- 0 Ошибки округления, дающие неправильные тесты в DFT?
- 1 LocalDb в проекте asp.net требуют, чтобы некоторые конфигурации запускались на другой машине? VS2012
- 0 Вставка данных в MySQL DB с использованием Python [дубликаты]
- 0 Laravel 5.5 Получить порядок сообщений по сумме голосов
- 0 Показать всех пользователей всех подразделений в активном каталоге, используя adLDAP?
- 0 Эффективный расчет частоты хэшей паролей в MySQL
- 1 Scrollview для Itemscontrol grid
- 1 Применить цвет к определенному слову в строке
- 1 System.ServiceModel.ProtocolException: удаленный сервер возвратил неожиданный ответ: (413) слишком сложный объект запроса
- 0 jQuery, как отключить функцию щелчка для строки при нажатии на первый элемент TD?
- 1 Речь Google TTS
- 0 Хранение указателя на функцию в качестве члена в классе
- 0 Как вставить массивы со значениями объектов в MySQL, используя для или foreach в JavaScript (nodejs)?
- 0 Передача данных между 2 окнами. Qt
- 1 Цвет узлов D3 на основе группы, определенной в CSV
Источник: overcoder.net
/openmp (Включение поддержки OpenMP)
Заставляет компилятор обрабатывать #pragma omp директивы для поддержки OpenMP.
Синтаксис
/openmp
/openmp:experimental
/openmp:llvm
Remarks
#pragma omp используется для указания директив и предложений. Если /openmp параметр не указан в компиляции, компилятор игнорирует предложения и директивы OpenMP. Вызовы функции OpenMP обрабатываются компилятором, даже если /openmp параметр не указан.
Компилятор C++ в настоящее время поддерживает стандарт OpenMP 2.0. Однако Visual Studio 2019 также теперь предлагает функции SIMD. Чтобы использовать SIMD, выполните компиляцию /openmp:experimental с помощью параметра . Этот параметр включает как обычные функции OpenMP, так и функции SIMD OpenMP, недоступные при использовании коммутатора /openmp .
Начиная с Visual Studio 2019 версии 16.9, вы можете использовать экспериментальный /openmp:llvm /openmp параметр вместо среды выполнения LLVM OpenMP. Поддержка в настоящее время недоступна для рабочего кода, так как необходимые библиотеки DLL libomp не являются распространяемыми. Параметр поддерживает те же директивы OpenMP 2.0, что и /openmp . Кроме того, он поддерживает все директивы SIMD, поддерживаемые параметром /openmp:experimental . Он также поддерживает неподписанные целочисленные индексы в параллельном режиме для циклов в соответствии со стандартом OpenMP 3.0. Дополнительные сведения см. в статье Улучшенная поддержка OpenMP для C++ в Visual Studio.
В настоящее /openmp:llvm время этот параметр работает только в архитектуре x64. Параметр несовместим с /clr или /ZW .
Приложения, скомпилированные с помощью и /openmp , /clr могут выполняться только в одном процессе домена приложения. Несколько доменов приложений не поддерживаются. То есть при запуске конструктора модуля ( .cctor ) он определяет, компилируется ли процесс с помощью /openmp и загружается ли приложение в среду выполнения, не являющуюся средой выполнения по умолчанию. Дополнительные сведения см. в разделах appdomain , /clr (компиляция СРЕДЫ CLR) и Инициализация смешанных сборок.
При попытке загрузить приложение, скомпилированное с помощью и /openmp /clr , в домен приложения, отличный от по умолчанию, TypeInitializationException исключение создается вне отладчика, а OpenMPWithMultipleAppdomainsException в отладчике возникает исключение.
Эти исключения также могут возникать в следующих ситуациях:
- Если приложение скомпилировано с помощью /clr , но не /openmp и загружается в домен приложения, отличный от домена приложения по умолчанию, где процесс включает приложение, скомпилированное с помощью /openmp .
- Если вы передаете приложение /clr в служебную программу, например regasm.exe, которая загружает целевые сборки в домен приложения, отличный от домена приложения по умолчанию.
Безопасность доступа к коду среды CLR не работает в регионах OpenMP. Если вы применяете атрибут безопасности доступа к коду CLR за пределами параллельного региона, он не будет действовать в параллельном регионе.
Корпорация Майкрософт не рекомендует создавать /openmp приложения, которые разрешают частично доверенные вызывающие абоненты. Не используйте AllowPartiallyTrustedCallersAttribute, или любые атрибуты безопасности доступа к коду CLR.
Установка данного параметра компилятора в среде разработки Visual Studio
- Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.
- Разверните страницу свойствC/C++>Languageсвойства> конфигурации.
- Измените свойство Поддержки OpenMP .
Установка данного параметра компилятора программным способом
- См. раздел OpenMP.
Пример
В следующем примере показаны некоторые эффекты запуска пула потоков и использования пула потоков после его запуска. При наличии 64-разрядных, одноядерных и двухпроцессорных процессоров для запуска пула потоков требуется около 16 мс. После этого для пула потоков будет немного дополнительных затрат.
При компиляции с помощью /openmp второй вызов test2 никогда не выполняется дольше, чем при компиляции с помощью /openmp- , так как пул потоков не запускается. При миллионе итераций версия работает быстрее, /openmp чем /openmp- версия для второго вызова test2. При 25 итераций /openmp- обе версии и /openmp регистрируют меньше детализации часов.
Если у вас есть только один цикл в приложении и он выполняется менее чем за 15 мс (с учетом приблизительной нагрузки на компьютере), /openmp возможно, не подходит. Если он выше, можно рассмотреть возможность использования /openmp .
// cpp_compiler_options_openmp.cpp #include #include #include #include volatile DWORD dwStart; volatile int global = 0; double test2(int num_steps) < int i; global++; double x, pi, sum = 0.0, step; step = 1.0 / (double) num_steps; #pragma omp parallel for reduction(+:sum) private(x) for (i = 1; i pi = step * sum; return pi; > int main(int argc, char* argv[]) < double d; int n = 1000000; if (argc >1) n = atoi(argv[1]); dwStart = GetTickCount(); d = test2(n); printf_s(«For %d steps, pi = %.15f, %d millisecondsn», n, d, GetTickCount() — dwStart); dwStart = GetTickCount(); d = test2(n); printf_s(«For %d steps, pi = %.15f, %d millisecondsn», n, d, GetTickCount() — dwStart); >
Источник: learn.microsoft.com
4.1. Программная модель OpenMP
В главе обсуждается механизм реализации многопоточности на основе технологии OpenMP – распределение нагрузки между потоками при обработке циклов, организация параллельной нециклической обработки и методы синхронизации потоков, а также некоторые дополнительные возможности библиотеки OpenMP. Рассматривается использование OpenMP в языках Си или Си++.
4.1. Программная модель OpenMP
Как уже обсуждалось в гл. 1, для введения многопоточности в последовательные языки программирования можно использовать механизмы, предоставляемые ОС, или специальные библиотеки. В предыдущей главе описаны средства организации многопоточности в OC Windows. Аналогичный POSIX-интерфейс для организации потоков (например, библиотека многопоточного программирования Pthreads) поддерживается на всех UNIX-системах.
Подход к созданию многопоточных приложений с помощью WinAPI или Pthreads можно назвать низкоуровневым, поскольку создание и управление потоками, а также их синхронизация описываются в приложениях явно. Более высокоуровневые механизмы многопоточности предоставляются объектно ориентировнными библиотеками (например, Qt, Intel® Threading Building Blocks). Одним из высокоуровневых подходов к созданию многопоточного приложения является также технология, основанная на директивах компилятора.
Многие поставщики SMP-архитектур (Sun, HP, SGI) в своих компиляторах поддерживают спецдирективы для распараллеливания циклов. Однако эти наборы директив, во-первых, весьма ограничены, а во-вторых, несовместимы между собой. Технология OpenMP является во многом обобщением и расширением упомянутых наборов директив.
Интерфейс OpenMP задуман как стандарт для программирования на масштабируемых SMP-системах в модели общей памяти. Первый стандарт OpenMP [80, 89] был разработан в 1997 году как API, ориентированный на написание переносимых многопоточных приложений. Сначала он был основан на языке Fortran, но уже в 1998 году вышли версии для языков Си и Си++. В настоящее время используется спецификация стандарта
Рис. 4.1. OpenMP-программа
Г л а в а 4. Технология программирования OpenMP
OpenMP v. 3.1, принятая в июле 2011 года. Изложение материала в настоящей главе основано на этой версии стандарта (см. также монографии и учебные пособия [2, 12, 13, 54, 91]). В июле 2013 года был выпущен следующий набор спецификаций стандарта OpenMP v. 4.0. В конце главы кратко обсуждаются новые возможности этой спецификации.
OpenMP предоставляет простой способ создания потоков в приложениях, не требуя от программиста глубоких знаний о создании, синхронизации и уничтожении потоков, не всегда даже актуально знание о том, сколько потоков следует создать. Разработчикам программ OpenMP предоставляет независимый от платформы набор директив ( Directives ), функций библиотеки OpenMP периода выполнения ( Runtime Library Routines ) и переменных среды ( Internal Control Variables, Environment Variables ), которые в совокупности указывают компилятору, как и где именно следует вставить потоки в приложение.
Простота использования такого подхода подкупает – большинство циклов можно распараллелить, вставив всего одну директиву непосредственно перед циклом. Однако следует отметить, что в настоящее время технология OpenMP является мощным, сложным и разветвленным средством прогрммирования ВС с общей памятью. Возможности написания эффективного параллельного кода на OpenMP далеко не ограничиваются вставкой пары директив в последовательную версию.
Технология OpenMP представляет программу (рис. 4.1) как совокупность параллельных и последовательных областей . В момент запуска программы порождается нить-мастер 1 (основная нить), которая начинает выполнение со стар-
товой точки. В последовательной
области программы всегда исполняется только основная нить. Для поддержки параллелизма используется схема FORK/JOIN. При входе в парал-
1 Согласно общепринятой терминалогии в OpenMP потоки называются нитями. Далее в этой главе мы будем придерживаться этого термина.
4.1. Программная модель OpenMP
лельную область нить-мастер порождает группу дополнительных нитей (FORK). Все порожденные нити, включая нить-мастер, исполняют один
и тот же код параллельной области. Когда нити группы завершают инструкции в параллельной области, они синхронизируются барьером (JOIN)
и закрываются, оставляя только нить-мастер. В параллельную область могут быть вложены другие параллельные области, в которых каждая нить первоначальной области становится мастером для соответствующей группы нитей.
Для возможности использования механизмов OpenMP необходимо скомпилировать программу компилятором, поддерживающим OpenMP, с указанием соответствующего ключа (табл. 4.1).
Источник: studfile.net