nvcc - 使用 cmake 将标志添加到特定文件

问题描述 投票:0回答:1

我正在写一个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
之后我尝试了其他几种变体,但都不起作用。这可能是一个简单的语法问题。

cmake cuda nvcc
1个回答
0
投票

看起来

COMPILE_FLAGS
(以及较新的
COMPILE_OPTIONS
)通常在
CUDA
源文件中或仅在nvcc中被完全忽略,因为我还没有使用clang或nvc ++为CUDA编译器测试过这一点。

最简单的解决方法(甚至可能是独立于该问题的更好策略和风格)是为需要不同编译器选项的每个文件或文件组提供一个 CMake 目标(例如静态库)。用于设置编译器选项的目标级 API 可以正常工作,并且使用起来更加优雅(避免显式属性名称,如

COMPILE_OPTIONS
,而有利于 CMake 函数名称,如
target_compile_options()
target_compile_features()
等),并轻松指定
 PRIVATE
vs
PUBLIC
)。

© www.soinside.com 2019 - 2024. All rights reserved.