Я написал небольшую программу (около 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
.
Рад предоставить больше информации по мере необходимости.