Добавление -fopenmp в программу с использованием Eigen вызывает ошибку компоновщика - PullRequest
0 голосов
/ 23 апреля 2020

Я написал небольшую программу (около 200 строк) на C ++, которая включает вычисления Eigen, а также неподдерживаемую библиотеку тензоров Eigen. Я получаю ошибку компоновки, когда я компилирую с -fopenmp, используя G CC, после изменения операторов include / define, следуя рекомендациям в Eigen docs. Текст ошибки ... объемный, но, похоже, внутри Eigen это невозможно найти определение для функции omp_get_max_num_threads во время соединения.

/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/../../../../x86_64-conda_cos6-linux-gnu/bin/ld: mytool.cpp:(.text._ZN5Eigen8internal16parallelize_gemmILb1ENS0_12gemm_functorIdlNS0_29general_matrix_matrix_productIldLi0ELb0EdLi0ELb0ELi0EEENS_5BlockINS5_INS_3MapINS_6MatrixIdLin1ELin1ELi0ELin1ELin1EEELi0ENS_6StrideILi0ELi0EEEEELin1ELin1ELb0EEELin1ELin1ELb0EEESD_SD_NS0_19gemm_blocking_spaceILi0EddLin1ELin1ELin1ELi1ELb0EEEEElEEvRKT0_T1_SK_SK_b[_ZN5Eigen8internal16parallelize_gemmILb1ENS0_12gemm_functorIdlNS0_29general_matrix_matrix_productIldLi0ELb0EdLi0ELb0ELi0EEENS_5BlockINS5_INS_3MapINS_6MatrixIdLin1ELin1ELi0ELin1ELin1EEELi0ENS_6StrideILi0ELi0EEEEELin1ELin1ELb0EEELin1ELin1ELb0EEESD_SD_NS0_19gemm_blocking_spaceILi0EddLin1ELin1ELin1ELi1ELb0EEEEElEEvRKT0_T1_SK_SK_b]+0x2b1): undefined reference to `omp_get_max_threads'

Это выводится на терминал множественно раз (не символ за символом такой же, но похожий), прежде чем компоновщик сдастся и остановится.

При компиляции без этого флага ошибка не выдается, и код выполняется (однопоточный), как и ожидалось. Я пытаюсь включить распараллеливание openMP, потому что я думал, что матричные продукты были распараллелены, если был добавлен этот флаг компилятора.

Я использовал #define EIGEN_USE_THREADS до включения тензорных библиотек, и я включил <Eigen/Core> в первую очередь над всеми другими собственными модулями. Я также вызываю setNbThreads(nthreads);, где nthreads - это int, после разбора командной строки. Наконец, если это имеет значение, я выполняю матричные операции с MatrixXd::Map, а не с простой матрицей, потому что я использовал библиотеку тензоров для работы с большим количеством индексов, прежде чем перейти к 2-тензору, который я затем отобразил на MatrixXd .

Рад предоставить больше информации по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...