rusty1s / pytorch_cluster

PyTorch Extension Library of Optimized Graph Cluster Algorithms
MIT License
813 stars 146 forks source link

CMake compilation should use C++17 for PyTorch 2? #229

Open GericoVi opened 6 days ago

GericoVi commented 6 days ago

Hi, I'm trying to compile the code on Windows using MSVC 2019. It seems that PyTorch 2 requires C++17 now, so if you want to build this repo for that using CMake I think line 3 in CMakeLists.txt should be changed from set(CMAKE_CXX_STANDARD 14) to set(CMAKE_CXX_STANDARD 17). The former is fine when linking PyTorch 1.8.0 for example but doesn't work for PyTorch 2.2.2 for example unless C++17 is used.

Presumably, the compilation on the python side doesn't use the CMakeLists.txt and provides it's own compiler arguments to use C++17? But when compiling it manually this seems to come up.

However, leaving set(CMAKE_CXX_STANDARD 17) but trying to compile with PyTorch 1.8.0 does not seem to work. With many of the same error but an example snippet is:

C:\Users\utcgv3g21\Desktop\libtorch-win-shared-with-deps-1.8.0+cpu\libtorch\include\c10\util\C++17.h(303): error C2872: 'std': ambiguous symbol
C:\Users\utcgv3g21\Desktop\libtorch-win-shared-with-deps-1.8.0+cpu\libtorch\include\c10/util/variant.h(2796): note: could be 'std'
C:\Users\utcgv3g21\Desktop\libtorch-win-shared-with-deps-1.8.0+cpu\libtorch\include\c10/util/C++17.h(303): note: or       'std'

Note that the same thing is true when trying to compile on MacOS with CMake (like in this example). In this case the error is pretty clear and suggests C++17:

[ 50%] Building CXX object CMakeFiles/hello-world.dir/main.cpp.o
In file included from /Users/gericovidanes/Repos/torch_cpp_test/main.cpp:1:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/torch/script.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/torch/csrc/api/include/torch/types.h:3:
/Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/ATen.h:4:2: error: C++17 or later compatible compiler is required to use ATen.
#error C++17 or later compatible compiler is required to use ATen.
 ^
In file included from /Users/gericovidanes/Repos/torch_cpp_test/main.cpp:1:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/torch/script.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/torch/csrc/api/include/torch/types.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/ATen.h:7:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/Context.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/CPUGeneratorImpl.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/core/Generator.h:11:
/Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/c10/util/Exception.h:118:34: error: no template named 'variant' in namespace 'std'
  using warning_variant_t = std::variant<UserWarning, DeprecationWarning>;
                            ~~~~~^
/Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/c10/util/Exception.h:121:7: error: unknown type name 'warning_variant_t'
      warning_variant_t type,
      ^
/Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/c10/util/Exception.h:127:7: error: unknown type name 'warning_variant_t'
      warning_variant_t type,
      ^
/Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/c10/util/Exception.h:133:7: error: unknown type name 'warning_variant_t'
      warning_variant_t type,
      ^
/Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/c10/util/Exception.h:139:3: error: unknown type name 'warning_variant_t'
  warning_variant_t type() const;
  ^
/Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/c10/util/Exception.h:146:3: error: unknown type name 'warning_variant_t'
  warning_variant_t type_;
  ^
In file included from /Users/gericovidanes/Repos/torch_cpp_test/main.cpp:1:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/torch/script.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/torch/csrc/api/include/torch/types.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/ATen.h:7:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/Context.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/CPUGeneratorImpl.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/core/Generator.h:12:
/Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/c10/util/C++17.h:27:2: error: You need C++17 to compile PyTorch
#error You need C++17 to compile PyTorch
 ^
In file included from /Users/gericovidanes/Repos/torch_cpp_test/main.cpp:1:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/torch/script.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/torch/csrc/api/include/torch/types.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/ATen.h:7:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/Context.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/CPUGeneratorImpl.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/core/Generator.h:13:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/c10/util/intrusive_ptr.h:4:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/c10/util/MaybeOwned.h:5:
/Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/c10/util/in_place.h:7:12: error: no member named 'in_place' in namespace 'std'
using std::in_place;
      ~~~~~^
/Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/c10/util/in_place.h:8:12: error: no member named 'in_place_index_t' in namespace 'std'
using std::in_place_index_t;
      ~~~~~^
/Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/c10/util/in_place.h:9:12: error: no member named 'in_place_t' in namespace 'std'
using std::in_place_t;
      ~~~~~^
/Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/c10/util/in_place.h:10:12: error: no member named 'in_place_type_t' in namespace 'std'
using std::in_place_type_t;
      ~~~~~^
In file included from /Users/gericovidanes/Repos/torch_cpp_test/main.cpp:1:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/torch/script.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/torch/csrc/api/include/torch/types.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/ATen.h:7:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/Context.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/CPUGeneratorImpl.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/core/Generator.h:13:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/c10/util/intrusive_ptr.h:4:
/Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/c10/util/MaybeOwned.h:86:23: error: unknown type name 'in_place_t'
  explicit MaybeOwned(in_place_t, Args&&... args)
                      ^
/Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/c10/util/MaybeOwned.h:178:27: error: unknown type name 'in_place_t'
  static MaybeOwned owned(in_place_t, Args&&... args) {
                          ^
/Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/c10/util/MaybeOwned.h:130:12: error: no template named 'is_nothrow_move_constructible_v' in namespace 'std'; did you mean 'is_nothrow_move_constructible'?
      std::is_nothrow_move_constructible_v<T>&&
      ~~~~~^
/Library/Developer/CommandLineTools/SDKs/MacOSX14.4.sdk/usr/include/c++/v1/__type_traits/is_nothrow_move_constructible.h:27:29: note: 'is_nothrow_move_constructible' declared here
struct _LIBCPP_TEMPLATE_VIS is_nothrow_move_constructible
                            ^
In file included from /Users/gericovidanes/Repos/torch_cpp_test/main.cpp:1:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/torch/script.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/torch/csrc/api/include/torch/types.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/ATen.h:7:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/Context.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/CPUGeneratorImpl.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/core/Generator.h:13:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/c10/util/intrusive_ptr.h:4:
/Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/c10/util/MaybeOwned.h:130:46: error: expected '(' for function-style cast or type construction
      std::is_nothrow_move_constructible_v<T>&&
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
/Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/c10/util/MaybeOwned.h:131:16: error: no template named 'is_nothrow_move_assignable_v' in namespace 'std'; did you mean 'is_nothrow_move_assignable'?
          std::is_nothrow_move_assignable_v<borrow_type>)
          ~~~~~^
/Library/Developer/CommandLineTools/SDKs/MacOSX14.4.sdk/usr/include/c++/v1/__type_traits/is_nothrow_move_assignable.h:24:29: note: 'is_nothrow_move_assignable' declared here
struct _LIBCPP_TEMPLATE_VIS is_nothrow_move_assignable
                            ^
In file included from /Users/gericovidanes/Repos/torch_cpp_test/main.cpp:1:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/torch/script.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/torch/csrc/api/include/torch/types.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/ATen.h:7:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/Context.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/CPUGeneratorImpl.h:3:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/ATen/core/Generator.h:13:
In file included from /Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/c10/util/intrusive_ptr.h:4:
/Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/c10/util/MaybeOwned.h:131:57: error: expected '(' for function-style cast or type construction
          std::is_nothrow_move_assignable_v<borrow_type>)
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
/Users/gericovidanes/miniforge3/envs/pytorch2.2/lib/python3.11/site-packages/torch/include/c10/util/MaybeOwned.h:141:12: error: no template named 'is_nothrow_move_assignable_v' in namespace 'std'; did you mean 'is_nothrow_move_assignable'?
      std::is_nothrow_move_assignable_v<T>&& std::is_nothrow_move_assignable_v<
      ~~~~~^
/Library/Developer/CommandLineTools/SDKs/MacOSX14.4.sdk/usr/include/c++/v1/__type_traits/is_nothrow_move_assignable.h:24:29: note: 'is_nothrow_move_assignable' declared here
struct _LIBCPP_TEMPLATE_VIS is_nothrow_move_assignable
                            ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
make[2]: *** [CMakeFiles/hello-world.dir/main.cpp.o] Error 1
make[1]: *** [CMakeFiles/hello-world.dir/all] Error 2
make: *** [all] Error 2

This is perhaps a PyTorch issue? But maybe a conditional in the CMakeLists.txt that uses either 14 or 17 depending on the libtorch version could work? Or just exposing this as a CMake variable?

Any thoughts on this?

GericoVi commented 6 days ago

Update, both C++17 and C++14 compilation actually does work when linking to PyTorch 1.13.1 for example. Unsure, which version is the breaking point, just adding this here for reference.