Advertisement
Guest User

Untitled

a guest
Dec 15th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.11 KB | None | 0 0
  1. Рассмотрим простейшую параллельную задачу. Пусть имеется массив данных произвольной природы, над которыми определена ассоциативная операция. Например, действительные и комплексные числа с операцией сложения. Требуется увеличить скорость применения этой операции ко всем числам путем распараллеливания.
  2.  
  3. Так как операция ассоциативная можно разделить массив на насколько частей и произвести вычисления каждой части в отдельном потоке. Далее необходимо применить операцию к промежуточным результатам, полученным после окончания выполнения потоков для получения окончательного результата. Использование параллельных система с общей памятью лишает необходимости в пересылке данных. Каждый поток самостоятельно заботиться о хранении промежуточных вычислений. Требуется лишь выделить каждому потоку область памяти куда следует сохранить результат его работы. Так как запись данных в каждую область производиться один раз и одним потоком, то не нужно заботиться о синхронизации данных. Однако необходимо произвести синхронизацию выполнения. Одному из потоков, как правило это будет первичный, необходимо дождаться окончания выполнения других потоков и после вычислить итоговый результат на основе промежуточных результатов.
  4.  
  5. Перейдем к сравнению реализаций.
  6. Используя POSIX Threads порядок действий должен быть следующий:
  7. 1. Определение места в памяти для хранения промежуточных результатов
  8. 2. Определение количества исполняемых потоков
  9. 3. Реализация создания дополнительных потоков, либо настройка существующих
  10. 4. Реализация вычисления подзадачи, исполняемой каждым, в том числе и первичным, потоком, а также определение самих подзадач для каждого потока, в данном случае границ исходного массива данных.
  11. 5. Реализация ожидания первичным потоком остальных потоков
  12. 6. Реализация вычисления окончательного результата
  13.  
  14. Используя POSIX Threads, программист должен позаботиться о всех этих действиях самостоятельно, однако, используя Open MP, часть действий берет на себя компилятор. Таким образом реализация упрощается и выглядит следующим образом:
  15. 1. Определение места в памяти для хранения промежуточных результатов
  16. 2. Определение параллельного блока директивой #pragma omp parallel
  17. 3. Определение количества исполняемых потоков используя параметр num_threads() директивы omp parallel или же без такового, используя пожелания пользователя задавшего переменную окружения OMP_NUM_THREADS
  18. 4. Реализация параллельного блока с учетом порядкового номера исполняемого потока
  19. 5. На этом этапе не требуется реализация синхронизации исполнения так компилятор самостоятельно реализует ожидание первичным потоком остальных.
  20. 6. Реализация вычисления окончательного результата
  21.  
  22. Как видно OMP позволяет освободить программиста от создания и синхронизации выполнения потоков. На практике же OMP позволяет писать более читаемых код, что упрощает разработку и сопровождение программы.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement