CMake:CUDA目标的特定于目标的预处理器定义似乎无法工作

3
我在Mac OSX 10.6上使用cmake 2.8.1和CUDA 3.0。因此,我添加了一个CUDA目标,需要将BLOCK_SIZE设置为某个数字以进行编译。
cuda_add_executable(SimpleTestsCUDA
                    SimpleTests.cu
                    BlockMatrix.cpp 
                    Matrix.cpp
)

set_target_properties(SimpleTestsCUDA PROPERTIES COMPILE_FLAGS -DBLOCK_SIZE=3)

当运行make VERBOSE=1时,我注意到nvcc被调用时没有使用-DBLOCK_SIZE=3,这会导致一个错误,因为代码中使用了BLOCK_SIZE,但没有定义。现在我在CPU目标(使用add_executable(...))中使用了相同的定义,它可以工作。
现在问题是:如果set_target_properties指向CUDA目标,我该如何找出cmake对其执行了什么操作?到处搜索并没有帮助,有个解决方法会很棒...

有人能在Linux或Windows上试一下吗?我现在只有我的MB Pro。 - Nils
在Windows上也不起作用。 - Maurice Gilden
2个回答

4
我认为最好的方法是通过在cuda_add_executable中添加"OPTIONS -DBLOCK_SIZE=3"来实现。因此,您的代码行应该如下所示:

cuda_add_executable(SimpleTestsCUDA
                SimpleTests.cu
                BlockMatrix.cpp 
                Matrix.cpp
                OPTIONS -DBLOCK_SIZE=3
)

或者你可以在cuda_add_executable之前设置它:

SET(CUDA_NVCC_FLAGS -DBLOCK_SIZE=3)

2
谢谢,目前看起来可以工作。也许我应该将此报告为错误? - Nils
SET(CUDA_NVCC_FLAGS -DBLOCK_SIZE = 3)对于所有目标都是相同的,您不能使用set重置它;它将为所有目标采用最新的。OPTIONS -DBLOCK_SIZE = 3似乎适用于cuda目标,但不适用于普通目标..我想我头疼了.. :( - Nils
OPTIONS 只能在 cuda_add_executable 中使用,对于 add_executable,您应该使用 set_target_properties。 - Maurice Gilden

0
到目前为止,我找到的唯一解决方法是使用remove_definitions:
remove_definitions(-DBLOCK_SIZE=3)
add_definitions(-DBLOCK_SIZE=32)

在目标之前这样做似乎有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接