Правильное использование целевой конструкции OpenMP

#multithreading #openmp

#многопоточность #openmp

Вопрос:

Я пытаюсь выяснить, правильно ли я использую конструкцию Openmp 4.

Было бы неплохо, если бы кто-нибудь мог дать мне несколько советов..

 class XY {
 #pragma omp declare target
  static void function_XY(){
    #pragma omp for
      loop{}
 #pragma omp end declare target


main() {
  var declaration
  some sequential stuff

  #pragma omp target map(some variables) {
  #pragma omp parallel {

  #pragma omp for
     loop1{}

  function_XY();

  #pragma omp for
     loop2{}

  }
  }

  some more sequential stuff
}
 

Мой общий код работает и становится быстрее с увеличением количества потоков, но мне интересно, правильно ли код выполняется на целевом устройстве (xeon phi).
Также, если я удаляю все содержимое omp и выполняю свою программу последовательно, она выполняется быстрее, чем выполнение с несколькими потоками (любым числом). Может быть, из-за инициализации omp?

Чего я хочу, так это параллельного выполнения: loop1, function_XY, loop2 на целевом устройстве.

Ответ №1:

» Мне интересно, правильно ли выполняется код на целевом устройстве (xeon phi)»

Что ж, если вы правильно компилируете код с флагом -mmic , то он сгенерирует двоичный файл, который выполняется только на mic.

Чтобы запустить код (в собственном режиме) на mic, скопируйте исполняемый файл на mic (через scp), скопируйте необходимые библиотеки, SSH на mic и выполните его.

Не забудьте экспортировать LD_LIBRARY_PATH, чтобы указать путь к библиотекам на mic.

Теперь, предполагая, что вы выполняете код на сопроцессоре, повышенная производительность при отключении многопоточности указывает на то, что где-то в коде есть узкое место. Но для анализа требуется больше информации.