Я экспериментировал с openmp и некоторыми математическими функциями на C. Если я пытаюсь объявить и инициализировать некоторые переменные вне параллельной конструкции, то использовать их в математической функции внутри параллели, когда я компилирую с использованием gcc -fopenmp practice.c -o practice
Iполучить следующую ошибку:
/usr/bin/ld: /tmp/ccQj4iIQ.o: in function `main._omp_fn.0':
practice.c:(.text+0xb3): undefined reference to `fmax'
collect2: error: ld returned 1 exit status
Эта проблема возникает с fmax
, fmin
, sqrt
, pow
, cos
и т. д. Некоторые примеры кода, иллюстрирующие это:
#include <omp.h>
#include <math.h>
void main(void){
double m=1;
double a=12;
#pragma omp parallel
{
m = fmax(m,a);
}
}
Я обнаружил, что проблема исчезнет, если я 1) переместу fmax
за пределы параллели, или 2) повторно инициализирую переменные внутри параллели, или 3) использую fmax
на 1и 12 прямо вместо м и а. Эта проблема также НЕ возникает, если я просто пытаюсь использовать printf
для печати m и a внутри параллели, поэтому я знаю, что каждый поток может «видеть» значения правильно.
Почему это происходит, иЕсть ли способ исправить это, кроме 3 вещей, которые я уже пробовал? Пока что мне кажется, что 2) - моя лучшая ставка, но глупо делать инициализацию сразу внутри параллели, когда было бы разумнее сделать это заранее.