我正在写一个CXX+CUDA项目,我正在使用nvcc进行编译,使用icpc的CXX编译器。
我想为不同的文件添加不同的icpc编译标志。在 CXX 独立中,可以使用
set_source_files_properties()
方法,但我在我的例子中尝试过,但没有成功。
我的结构的最小示例 -
cat main.cu
#include "file1.cuh"
#include "file2.cuh"
int main() {
int3 size = make_int3(1, 1, 1);
std::cout << size.x << std::endl;
print_x<<<1,1>>>(size);
print_y<<<1,1>>>(size);
return 0;
}
cat file1.cuh
#include <cuda_runtime.h>
__global__ void print_x(int3 arr);
cat file1.cu
#include "file1.cuh"
#include <iostream>
__global__ void print_x(int3 arr) { printf("%d", arr.x); }
cat file2.cuh
#include <cuda_runtime.h>
#include <iostream>
__global__ void print_y(int3 arr);
cat file2.cu
#include "file2.cuh"
__global__ void print_y(int3 arr) { printf("%d", arr.y); }
cat CMakeLists.txt
set(CMAKE_C_COMPILER "icc")
set(CMAKE_CXX_COMPILER "icpc")
set(CMAKE_CUDA_COMPILER "nvcc")
project(proj LANGUAGES CXX CUDA)
set(COMMON_CC_COMPILER_FLAGS -std=c++17 -Wextra -pedantic -Werror -Wall -lstdc++fs)
set(COMMON_FLAGS ${COMMON_CC_COMPILER_FLAGS})
string(JOIN ", " COMMON_FLAGS_FOR_CUDA_CC_COMPILER "${COMMON_CC_COMPILER_FLAGS}")
string(REPLACE ";" "," COMMON_FLAGS_FOR_CUDA_CC_COMPILER "${COMMON_FLAGS_FOR_CUDA_CC_COMPILER}")
set(CMAKE_CUDA_STANDARD 17)
set(COMMON_FLAGS_CUDA -ccbin=icpc --compiler-options "${COMMON_FLAGS_FOR_CUDA_CC_COMPILER}")
string(REPLACE ";" " " FLAGS "${COMMON_FLAGS}")
list(APPEND COMMON_FLAGS -DFLAGS="${FLAGS}")
include_directories(${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES})
add_executable(proj main.cu file1.cu file2.cu)
target_compile_options(proj PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${COMMON_FLAGS}> $<$<COMPILE_LANGUAGE:CUDA>:${COMMON_FLAGS_CUDA}>)
编译此项目时,
--compiler-options
下的标志确实正确传递给icpc,但我希望每个源都有不同的标志。
比如我想获取编译命令
nvcc -ccbin=icpc --compiler-options -std=c++17 -Wextra -pedantic -Werror -Wall -lstdc++fs ... file1.cu
nvcc -ccbin=icpc --compiler-options -std=c++17 -Wall -lstdc++fs ... file2.cu
请注意,我希望使用 CMake 自动完成编译,因为我有一个包含许多组件的大型项目,因此
CUDA_COMPILE
方法的使用与我的状态无关。
我正在寻找一些适用于我的范围的set_source_files_properties()
的并行方法。
编辑 为了进一步解释我对
set_source_file_properties()
的尝试 -
我将行 set_source_files_properties(file1.cu PROPERTIES COMPILE_FLAGS "--compiler-options -Wall")
添加到 CMakeLists.txt
文件中,并且使用 VERBOSE=1 make
看到应用于该文件的编译命令没有任何变化。在PROPERTIES
之后我尝试了其他几种变体,但都不起作用。这可能是一个简单的语法问题。
看起来
COMPILE_FLAGS
(以及较新的COMPILE_OPTIONS
)通常在CUDA
源文件中或仅在nvcc中被完全忽略,因为我还没有使用clang或nvc ++为CUDA编译器测试过这一点。
最简单的解决方法(甚至可能是独立于该问题的更好策略和风格)是为需要不同编译器选项的每个文件或文件组提供一个 CMake 目标(例如静态库)。用于设置编译器选项的目标级 API 可以正常工作,并且使用起来更加优雅(避免显式属性名称,如
COMPILE_OPTIONS
,而有利于 CMake 函数名称,如 target_compile_options()
、target_compile_features()
等),并轻松指定 PRIVATE
vs PUBLIC
)。