Зависимость по данным (Data Dependencies) и возникновение гонок (Race Conditions)

Зависимость по данным(Data dependencies) возникает из-за того, что на различных итерациях цикла происходит чтение/запись данных в общую память.

Например, вычисления факториала.

// Do NOT do this. It will fail due to data dependencies. // Each loop iteration writes a value that a different iteration reads. #pragma omp parallel for for (i=2; i < 10; i++) { factorial[i] = i * factorial[i-1]; }

Компилятор распараллелит этот цикл, однако результат, из-за зависимости итераций, может быть не верным. Такая ситуация называется «состояние гонки» (race condition).

Программа может отработать правильно, такой случай называется «выиграть гонку», но четко предугадать правильность ее работы в следующий раз (на другой системе) нельзя.

Обычное решение проблемы – переписать цикл, выбрать другой алгоритм.

Директива SECTIONS

Назначение:

  • Обеспечивает параллелизм на уровне независимых фрагментов. Указывает, что секции, содержащие блоки кода должны быть распределены между нитями. Иными словами, используя данную директиву, программист показывает, что ряд фрагментов кода программы информационно независимы, и их можно исполнять в любом порядке, в частности, параллельно друг другу. Каждый из таких фрагментов будет выполнен какой-либо одной нитью.
  • Независимые секции включаются в директиву SECTIONS. Каждая секция исполняется один раз какой-либо нитью. Возможно, также, что выполнение разных секций может проводится одной нитью (по выполнении одной секции – приступает к другой).

Формат:

#pragma omp sections [clause...] newline private (list) firstprivate (list) lastprivate (list) reduction (operator: list) nowait { #pragma omp section newline structured_block #pragma omp section newline structured_block }

Опции:

  • Если не используется nowait, предполагается барьер-синхронизация нитей в конце блока SECTIONS.
  • Опции private,firstprivate, lastprivate, reduction будут рассмотрены позднее.

Ограничения:

  • Нельзя использовать операторы перехода из и в блоки секций (It is illegal to branch into or out of section blocks).
  • Набор директив SECTION должны быть включены в директиву SECTIONS.

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: