Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Рассмотрим простейшую параллельную задачу. Пусть имеется массив данных произвольной природы, над которыми определена ассоциативная операция. Например, действительные и комплексные числа с операцией сложения. Требуется увеличить скорость применения этой операции ко всем числам путем распараллеливания.
- Так как операция ассоциативная можно разделить массив на насколько частей и произвести вычисления каждой части в отдельном потоке. Далее необходимо применить операцию к промежуточным результатам, полученным после окончания выполнения потоков для получения окончательного результата. Использование параллельных система с общей памятью лишает необходимости в пересылке данных. Каждый поток самостоятельно заботиться о хранении промежуточных вычислений. Требуется лишь выделить каждому потоку область памяти куда следует сохранить результат его работы. Так как запись данных в каждую область производиться один раз и одним потоком, то не нужно заботиться о синхронизации данных. Однако необходимо произвести синхронизацию выполнения. Одному из потоков, как правило это будет первичный, необходимо дождаться окончания выполнения других потоков и после вычислить итоговый результат на основе промежуточных результатов.
- Перейдем к сравнению реализаций.
- Используя POSIX Threads порядок действий должен быть следующий:
- 1. Определение места в памяти для хранения промежуточных результатов
- 2. Определение количества исполняемых потоков
- 3. Реализация создания дополнительных потоков, либо настройка существующих
- 4. Реализация вычисления подзадачи, исполняемой каждым, в том числе и первичным, потоком, а также определение самих подзадач для каждого потока, в данном случае границ исходного массива данных.
- 5. Реализация ожидания первичным потоком остальных потоков
- 6. Реализация вычисления окончательного результата
- Используя POSIX Threads, программист должен позаботиться о всех этих действиях самостоятельно, однако, используя Open MP, часть действий берет на себя компилятор. Таким образом реализация упрощается и выглядит следующим образом:
- 1. Определение места в памяти для хранения промежуточных результатов
- 2. Определение параллельного блока директивой #pragma omp parallel
- 3. Определение количества исполняемых потоков используя параметр num_threads() директивы omp parallel или же без такового, используя пожелания пользователя задавшего переменную окружения OMP_NUM_THREADS
- 4. Реализация параллельного блока с учетом порядкового номера исполняемого потока
- 5. На этом этапе не требуется реализация синхронизации исполнения так компилятор самостоятельно реализует ожидание первичным потоком остальных.
- 6. Реализация вычисления окончательного результата
- Как видно OMP позволяет освободить программиста от создания и синхронизации выполнения потоков. На практике же OMP позволяет писать более читаемых код, что упрощает разработку и сопровождение программы.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement