Как запустить openmp программу

Скомпилирован с 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 .

Читайте также:
Как пользоваться программой genopro

Начиная с 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

  1. Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.
  2. Разверните страницу свойствC/C++>Languageсвойства> конфигурации.
  3. Измените свойство Поддержки 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

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru