c++ __CUDA__为.cu文件运行nvcc时未定义

yhived7q  于 2023-03-25  发布在  其他
关注(0)|答案(1)|浏览(192)

我试图编译一个.cu文件,其中包含一个.cuh文件,该文件带有使用nvcc的模板化设备函数。同一个.cuh文件也包含在.cpp中,因此我试图防止模板化设备函数从.cpp端可见。为此,我使用
foo.cuh

#if defined(__CUDA__) && defined(__CUDA_ARCH__)

template <typename T>
__device__ void foo(){...}
#endif

然而,当我试图从内核中使用device函数时,它说在编译. cu时该函数不存在。如果我删除__CUDA__检查,.cu编译正常,但在这种情况下,它在编译.cpp文件时失败。
我在支票上漏掉了什么吗?

4xrmg8kj

4xrmg8kj1#

nvcc没有定义__CUDA__宏。因此,除非您在某个地方使用自己的方法定义了它(?),否则您的#if指令将始终被跳过。
你想要__CUDACC__吗?
示例:

$ cat test.cuh
#ifdef __CUDACC__
__device__ void foo(){};
#endif

void f();

$ cat main.cpp
#include <test.cuh>

int main(){
  f();
}
$ cat test.cu
#include <test.cuh>
__global__ void k(){foo();}

void f(){

  k<<<1,1>>>();
  cudaDeviceSynchronize();
}
$ nvcc -I. -o test test.cu main.cpp
$ g++  -I. -c main.cpp
$ nvcc -I. -o test test.cu main.o
$ compute-sanitizer ./test
========= COMPUTE-SANITIZER
========= ERROR SUMMARY: 0 errors
$

(the __CUDA_ARCH__宏在这里也是not needed

相关问题