在我的CMakeLists.txt
中,我正在加载如下环境变量:
cmake_minimum_required(VERSION 2.6)
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} $ENV{CUDA_NVCC_FLAGS} -lineinfo --default-stream per-thread --disable-warnings")
message("CUDA_NVCC_FLAGS = ${CUDA_NVCC_FLAGS}")
但是,在干净(rm -r build
)之后的首次构建尝试中,它只会忽略CUDA_NVCC_FLAGS
变量,从而导致构建失败:
cmake -D CMAKE_CXX_FLAGS="-g -O3 -fmax-errors=1" ../../
make -j8
控制台输出:
CUDA_NVCC_FLAGS = -gencode arch=compute_61,code=sm_61 -lineinfo --default-stream per-thread --disable-warnings
...
/home/mad/workspace/automy-system/vision/src/DeBayerFilter.cu(132): warning: integer conversion resulted in truncation
/home/mad/workspace/automy-system/vision/src/HeightMapFilter.cu(115): error: identifier "__ldg" is undefined
构建失败,因为我的CUDA代码需要由CUDA_NVCC_FLAGS
启用的特定计算功能。
第二次尝试,之后效果很好。
cmake version 3.5.1
答案 0 :(得分:1)
与其他任何CMAKE_<LANG>_FLAGS
变量一样,在检测到编译器时,会在CUDA_NVCC_FLAGS
调用中设置project(CUDA)
变量。因此,应在project
调用之后后执行附加到该变量的操作:
project(MyProject CUDA)
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} $ENV{CUDA_NVCC_FLAGS} -lineinfo --default-stream per-thread --disable-warnings")
如果使用find_package(CUDA)
检测到CUDA(在本机不支持CUDA的旧CMake版本中),则应在find_package(CUDA)
之后附加标志,这将设置CUDA_NVCC_FLAGS
变量:
find_package(CUDA REQUIRED)
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} $ENV{CUDA_NVCC_FLAGS} -lineinfo --default-stream per-thread --disable-warnings")
反序起作用的原因(但仅在非第一配置中有效)是因为变量CUDA_NVCC_FLAGS
实际上已被缓存:第一个project()
调用设置了变量的值并将其存储到缓存中。进一步的project()
调用会检测到编译器已被检查,因此不会重新设置变量。