test cuda: import fmt in CUDA source code
Current test is only for Windows(cl.exe). Need to test more with the other host compilers... * Activate the test when `find_package(CUDA)` worked * The test runs with C++14 Detailed comments in 'test/cuda-test'
This commit is contained in:
parent
f5556225a4
commit
ba82f542d6
@ -225,3 +225,22 @@ if (FMT_PEDANTIC AND NOT WIN32)
|
||||
"-DPEDANTIC_COMPILE_FLAGS=${PEDANTIC_COMPILE_FLAGS}"
|
||||
"-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}")
|
||||
endif ()
|
||||
|
||||
#
|
||||
# Activate CUDA related tests (Optional)
|
||||
# if and only if we can find the CUDA in current CMake run.
|
||||
#
|
||||
find_package(CUDA 9.2)
|
||||
if(CUDA_FOUND)
|
||||
add_test(cuda-test ${CMAKE_CTEST_COMMAND}
|
||||
-C ${CMAKE_BUILD_TYPE}
|
||||
--build-and-test
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/cuda-test"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/cuda-test"
|
||||
--build-generator ${CMAKE_GENERATOR}
|
||||
--build-makeprogram ${CMAKE_MAKE_PROGRAM}
|
||||
--build-options
|
||||
"-DFMT_DIR=${PROJECT_BINARY_DIR}"
|
||||
"-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
|
||||
)
|
||||
endif()
|
||||
|
||||
104
test/cuda-test/CMakeLists.txt
Normal file
104
test/cuda-test/CMakeLists.txt
Normal file
@ -0,0 +1,104 @@
|
||||
|
||||
#
|
||||
# We can find some usecases which follows the guide of CMake.
|
||||
# The way replaces 'find_package(CUDA)' to 'enable_language(CUDA)'.
|
||||
# And let the CMake built-in functions to use NVCC.
|
||||
#
|
||||
# See: https://cmake.org/cmake/help/latest/module/FindCUDA.html#replacement
|
||||
#
|
||||
# However, such CMake versions are pretty high (3.10 or later).
|
||||
# And we can't sure most of the CUDA projects are using those latest
|
||||
# because the latest C++ standard for NVCC is C++ 14 at this moment.
|
||||
#
|
||||
# In conclusion, this test will use older version of CMake,
|
||||
# and rely on 'find_package(CUDA)'. For its version, do follow the Root CMakeLists.txt.
|
||||
#
|
||||
|
||||
#
|
||||
# cmake_minimum_required(VERSION 3.10)
|
||||
# project(fmt-cuda-test LANGUAGES CXX CUDA) # see 'enable_language(CUDA)'
|
||||
cmake_minimum_required(VERSION 3.1) # for C++ 14
|
||||
project(fmt-cuda-test LANGUAGES CXX)
|
||||
|
||||
# find from ${PROJECT_BINARY_DIR}
|
||||
find_package(FMT REQUIRED)
|
||||
|
||||
# The environment variables(CUDA_BIN_PATH & CUDA_PATH) must be specified at this point
|
||||
find_package(CUDA REQUIRED)
|
||||
|
||||
#
|
||||
# Update these when NVCC becomes ready for C++ 17 features
|
||||
# https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#cpp14-language-features
|
||||
#
|
||||
set(CMAKE_CUDA_STANDARD 14)
|
||||
set(CMAKE_CUDA_STANDARD_REQUIRED 14)
|
||||
|
||||
list(APPEND CUDA_NVCC_FLAGS "-std=c++14")
|
||||
if(MSVC)
|
||||
# this is the solution of pytorch
|
||||
# https://github.com/pytorch/pytorch/pull/7118
|
||||
list(APPEND CUDA_NVCC_FLAGS "-Xcompiler" "/std:c++14")
|
||||
list(APPEND CUDA_NVCC_FLAGS "-Xcompiler" "/Zc:__cplusplus")
|
||||
# for the reason of this -Xcompiler options, see below ...
|
||||
endif()
|
||||
|
||||
#
|
||||
# In this test, we will assume that
|
||||
# the user is going to pre-compile CUDA source codes
|
||||
# with some libraries (including this 'fmt').
|
||||
#
|
||||
# In addition to that,
|
||||
# this test will invoke both C++ Host compiler and NVCC
|
||||
# by providing another (non-CUDA) C++ source code
|
||||
#
|
||||
cuda_add_executable(fmt-in-cuda-test
|
||||
cuda-cpp14.cu
|
||||
cpp14.cc
|
||||
)
|
||||
|
||||
#
|
||||
# https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html
|
||||
#
|
||||
set_target_properties(fmt-in-cuda-test
|
||||
PROPERTIES
|
||||
CXX_STANDARD 14 # Notice this is for C++ code
|
||||
POSITION_INDEPENDENT_CODE ON
|
||||
)
|
||||
# target_compile_features(fmt-in-cuda-test
|
||||
# PRIVATE
|
||||
# cxx_std_14 # just make sure of the property is available
|
||||
# )
|
||||
|
||||
get_target_property(cuda_standard
|
||||
fmt-in-cuda-test CUDA_STANDARD
|
||||
)
|
||||
message(STATUS "cuda_standard: ${cuda_standard}")
|
||||
|
||||
get_target_property(cuda_standard_required
|
||||
fmt-in-cuda-test CUDA_STANDARD_REQUIRED
|
||||
)
|
||||
message(STATUS "cuda_standard_required: ${cuda_standard_required}")
|
||||
|
||||
#
|
||||
# https://cmake.org/cmake/help/latest/module/FindCUDA.html
|
||||
#
|
||||
# From the document, you can see "The default is to use no keyword"
|
||||
#
|
||||
target_link_libraries(fmt-in-cuda-test
|
||||
# PUBLIC
|
||||
fmt::fmt
|
||||
)
|
||||
|
||||
if(MSVC)
|
||||
#
|
||||
# MSVC places incorrect '__cplusplus' macro. Follow the guideline.
|
||||
#
|
||||
# https://github.com/Microsoft/vscode-cpptools/issues/2595
|
||||
# https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/
|
||||
#
|
||||
target_compile_options(fmt-in-cuda-test
|
||||
PRIVATE
|
||||
/Zc:__cplusplus
|
||||
/permissive-
|
||||
)
|
||||
endif()
|
||||
8
test/cuda-test/cpp14.cc
Normal file
8
test/cuda-test/cpp14.cc
Normal file
@ -0,0 +1,8 @@
|
||||
|
||||
#include <fmt/core.h>
|
||||
|
||||
static_assert(__cplusplus >= 201402L, "expect C++ 2014");
|
||||
|
||||
auto make_message_cpp() -> std::string{
|
||||
return fmt::format("host compiler\t: __cplusplus == {}", __cplusplus);
|
||||
}
|
||||
32
test/cuda-test/cuda-cpp14.cu
Normal file
32
test/cuda-test/cuda-cpp14.cu
Normal file
@ -0,0 +1,32 @@
|
||||
|
||||
//
|
||||
// nvcc -x cu -std=c++14 ..\test\cuda-test\include_test.cu -I"../include" -Xcompiler /Zc:__cplusplus -l"fmtd" -L"../build/Debug"
|
||||
//
|
||||
|
||||
//
|
||||
// Ensure that we are using the expected standard
|
||||
// https://en.cppreference.com/w/cpp/preprocessor/replace#Predefined_macros
|
||||
//
|
||||
static_assert(__cplusplus >= 201402L, "expect C++ 2014 for nvcc");
|
||||
|
||||
#if defined(__CUDACC__)
|
||||
# define FMT_DEPRECATED
|
||||
#endif
|
||||
#include <fmt/core.h>
|
||||
|
||||
#include <cuda.h>
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
extern auto make_message_cpp() -> std::string;
|
||||
extern auto make_message_cuda() -> std::string;
|
||||
|
||||
int main(int, char*[]){
|
||||
cout << make_message_cuda() << endl;
|
||||
cout << make_message_cpp() << endl;
|
||||
}
|
||||
|
||||
auto make_message_cuda() -> std::string{
|
||||
return fmt::format("nvcc \t: __cplusplus == {}", __cplusplus);
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user