Возможно, вы захотите посмотреть 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
и т. Д. Затем они передаются как указатели на исходные переменные в глобальных данных и / или стеке главного потока.