关于CUDA宏__CUDA_ARCH_的问题



我在ttt.cu中有一个简单的cuda代码

#include <iostream>
__global__ void example(){
printf("__CUDA_ARCH__: %d n", __CUDA_ARCH__);
}
int main(){
example<<<1,1>>>();
}

带有CMakeLists.txt:

cmake_minimum_required(VERSION 3.18)
project(Hello)
find_package(CUDA REQUIRED)
cuda_add_executable(sss ttt.cu)

然后我得到了错误:identifier "__CUDA_ARCH__" is undefined。我想知道为什么会发生这种情况,以及我应该如何使__CUDA_ARCH__有效?我们可以在头.h文件中的主机代码中使用有效的__CUDA_ARCH__吗?

更新:

我本来打算用下面的cmake生成一个750库达的拱门,但这总是导致__CUDA_ARCH__=300(2080 ti,库达10.1(。我尝试了set_propertytarget_compile_options,但都失败了。

cmake_minimum_required(VERSION 3.18)
project(Hello)
find_package(CUDA REQUIRED)
cuda_add_executable(oounne ttt.cu)
set_property(TARGET oounne PROPERTY CUDA_ARCHITECTURES 75)
#target_compile_options(oounne PRIVATE  $<$<COMPILE_LANGUAGE:CUDA>:-gencode 
arch=compute_75,code=sm_75>)

__CUDA_ARCH__编译器宏

我们可以在主机代码中使用有效的__CUDA_ARCH__

不,它仅用于设备代码:

主机代码(非GPU代码(不得依赖于它。

您无法按照想象的方式打印编译器宏。它不是C++中定义的普通数值变量。您可以执行类似的操作,但它将在编译时打印,而不是在运行时打印。

要在运行时打印,可以执行以下操作:

$ cat t2.cu
#include <cstdio>
#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)
__device__ void print_arch(){
const char my_compile_time_arch[] = STR(__CUDA_ARCH__);
printf("__CUDA_ARCH__: %sn", my_compile_time_arch);
}
__global__ void example()
{
print_arch();
}
int main(){
example<<<1,1>>>();
cudaDeviceSynchronize();
}
$ nvcc -o t2 t2.cu
$ ./t2
__CUDA_ARCH__: 520
$

请注意,在讨论__CUDA_ARCH__cuda标签上有很多问题,您可能希望回顾其中的一些问题。

相关内容

  • 没有找到相关文章

最新更新