Как OpenMP предоставляет прагма-функции? - PullRequest
0 голосов
/ 12 июня 2019

Мне очень любопытно, OpenMP предоставляет такие прагматические функции, как #pragma omp parallel. Как это обеспечивает?

1 Ответ

2 голосов
/ 12 июня 2019

Возможно, вы захотите посмотреть https://www.dontknow.de/openmp-stuff/ на моем сайте. В нем кратко рассказывается о работе компиляторов OpenMP. Он должен ответить на самые основные вопросы о преобразованиях кода и взаимодействиях с библиотекой потоков нижнего уровня.

Основная идея в том, что такой код

#include <stdio.h>

int main(int argc, char **argv) {
#pragma omp parallel num_threads(NUM_THREADS)
    printf(“Hello World\n”);
    return 0;
}

преобразуется так:

void main_omp_func_0() {
    printf(“Hello World\n”);
}

int main(int argc, char **argv) {
    _omp_start_parallel_region(main_omp_func_0);
    main_omp_func_0();
    _omp_end_parallel_region();
    return 0;
}

Компилятор должен будет сделать немного больше, если данные должны быть переданы в параллельную область, например, при использовании переменных shared, private и т. Д. Затем они передаются как указатели на исходные переменные в глобальных данных и / или стеке главного потока.

...