#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.
Теперь, предполагая, что вы выполняете код на сопроцессоре, повышенная производительность при отключении многопоточности указывает на то, что где-то в коде есть узкое место. Но для анализа требуется больше информации.