Ошибка компиляции Eigen с компилятором PGI - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь скомпилировать код, включающий заголовки для Eigen, используя компилятор PGI C ++, но получаю следующую ошибку:

"/opt/local/include/eigen3/Eigen/src/Core/arch/SSE/PacketMath.h", line 413:
          error: more than one instance of overloaded function "_mm_prefetch"
          matches the argument list:
            function "_mm_prefetch(const char *, int)"
            function "_mm_prefetch(const void *, _mm_hint)"
            argument types are: (const char *, _mm_hint)
  template<> EIGEN_STRONG_INLINE void prefetch<float>(const float*   addr) { _mm_prefetch((const char*)(addr), _MM_HINT_T0); }
                                                                             ^

"/opt/local/include/eigen3/Eigen/src/Core/arch/SSE/PacketMath.h", line 414:
          error: more than one instance of overloaded function "_mm_prefetch"
          matches the argument list:
            function "_mm_prefetch(const char *, int)"
            function "_mm_prefetch(const void *, _mm_hint)"
            argument types are: (const char *, _mm_hint)
  template<> EIGEN_STRONG_INLINE void prefetch<double>(const double* addr) { _mm_prefetch((const char*)(addr), _MM_HINT_T0); }
                                                                             ^

"/opt/local/include/eigen3/Eigen/src/Core/arch/SSE/PacketMath.h", line 415:
          error: more than one instance of overloaded function "_mm_prefetch"
          matches the argument list:
            function "_mm_prefetch(const char *, int)"
            function "_mm_prefetch(const void *, _mm_hint)"
            argument types are: (const char *, _mm_hint)
  template<> EIGEN_STRONG_INLINE void prefetch<int>(const int*       addr) { _mm_prefetch((const char*)(addr), _MM_HINT_T0); }
                                                                             ^

"/opt/local/include/eigen3/Eigen/src/Core/arch/SSE/Complex.h", line 131: error:
          more than one instance of overloaded function "_mm_prefetch" matches
          the argument list:
            function "_mm_prefetch(const char *, int)"
            function "_mm_prefetch(const void *, _mm_hint)"
            argument types are: (const char *, _mm_hint)
  template<> EIGEN_STRONG_INLINE void prefetch<std::complex<float> >(const std::complex<float> *   addr) { _mm_prefetch((const char*)(addr), _MM_HINT_T0); }
                                                                                                           ^

"/opt/local/include/eigen3/Eigen/src/Core/arch/SSE/Complex.h", line 343: error:
          more than one instance of overloaded function "_mm_prefetch" matches
          the argument list:
            function "_mm_prefetch(const char *, int)"
            function "_mm_prefetch(const void *, _mm_hint)"
            argument types are: (const char *, _mm_hint)
  template<> EIGEN_STRONG_INLINE void prefetch<std::complex<double> >(const std::complex<double> *   addr) { _mm_prefetch((const char*)(addr), _MM_HINT_T0); }
                                                                                                             ^

5 errors detected in the compilation of "/Users/wooden/CLionProjects/EigenTest/main.cpp".
make[2]: *** [CMakeFiles/EigenTest.dir/main.cpp.o] Error 2
make[1]: *** [CMakeFiles/EigenTest.dir/all] Error 2
make: *** [all] Error 2

Я получаю ту же ошибку независимо от того, какой код компилируется, пока заголовок EigenВключено.Более конкретно, я включаю следующее:

#include <Eigen/Eigen>

И попробуйте скомпилировать простую программу "Hello World".CMakeLists.txt, кроме директив Эйгена, также является barebone-файлами.

cmake_minimum_required(VERSION 3.10)
project(EigenTest)

set(CMAKE_CXX_STANDARD 11)

add_executable(EigenTest main.cpp)

find_package (Eigen3 3.3 REQUIRED NO_MODULE)
target_link_libraries (EigenTest Eigen3::Eigen)

Следует отметить, что я работаю на macOS Sierra (10.12.6) и пробовал обе версии PGI версии 17.10 и v18.4.Никакие специальные флаги не используются для компиляции.Установленный пакет Eigen является самым последним на MacPorts (eigen3 3.3.4).

Раньше я использовал нетривиальное использование Eigen, и все хорошо работает с GCC.Я также использовал компиляторы PGI раньше без проблем.Причина, по которой я пытаюсь использовать оба одновременно, заключается в том, что мне нужно использовать прагмы OpenACC в определенных частях моего кода, использующего Eigen.

Любая помощь, ведущая меня в правильном направлении, будет принята с благодарностью.

Обновление 1

Приведение addr к const void* вместо const char* в вышеупомянутых строках ошибки (или комментирование упомянутых строк) в исходных файлах Eigen, я не получаю компиляциюошибка больше.Я могу получить базовую функциональность от Eigen, но более сложный код не связывается успешно.Возникает следующая ошибка:

Undefined symbols for architecture x86_64:


"__ZN98_INTERNAL_76__Users_wooden_CLionProjects_MLProject_src_Classification_LogisticRegression_cpp_c51a32f316_mm_castpd_si128E7__m128d", referenced from:
      __ZN5Eigen8internal29general_matrix_vector_productIldNS0_22const_blas_data_mapperIdlLi1EEELi1ELb0EdNS2_IdlLi0EEELb0ELi0EE3runEllRKS3_RKS4_Pdld in LogisticRegression.cpp.o
      __ZN5Eigen8internal11palign_implILi1E7__m128dE3runERS2_RKS2_ in LogisticRegression.cpp.o
      __ZN5Eigen8internal6palignILi1E7__m128dEEvRT0_RKS3_ in LogisticRegression.cpp.o
  "__ZN98_INTERNAL_76__Users_wooden_CLionProjects_MLProject_src_Classification_LogisticRegression_cpp_c51a32f316_mm_castsi128_pdE7__m128i", referenced from:
      __ZN5Eigen8internal29general_matrix_vector_productIldNS0_22const_blas_data_mapperIdlLi1EEELi1ELb0EdNS2_IdlLi0EEELb0ELi0EE3runEllRKS3_RKS4_Pdld in LogisticRegression.cpp.o
      __ZN5Eigen8internal11palign_implILi1E7__m128dE3runERS2_RKS2_ in LogisticRegression.cpp.o
      __ZN5Eigen8internal4pexpI7__m128dEET_RKS3_ in LogisticRegression.cpp.o
      __ZN5Eigen8internal6palignILi1E7__m128dEEvRT0_RKS3_ in LogisticRegression.cpp.o
ld: symbol(s) not found for architecture x86_64
make[2]: *** [MLProject] Error 2
make[1]: *** [CMakeFiles/MLProject.dir/all] Error 2
make: *** [all] Error 2

Обновление 2

Использование -DEIGEN_DONT_VECTORIZE, как предложено @chtz в комментариях, что отключает встроенную векторизацию Eigen, код проекта компилируется, связывается и выполняетсяуспешно.Однако это создает серьезную проблему, так как Eigen для начальных реализаций линейной алгебры использовался для начала.

Что касается ошибки компиляции, это может быть связано с поддержкой PGI типа _mm_castpd_si128 в соответствии с @ggael.

В общем, кажется, что совместимость Eigen с компилятором PGI C ++ в лучшем случае частичная.

...