c++ - .cu 源文件中默认包含哪些 header ?

标签 c++ cuda nvcc

我想知道哪些 header 隐式包含在 .cu 编译单元中。例如,让我们举一些基本的例子:

#include <iostream>

__global__ void kernel(int a, int b, int *c)
{
    *c = a * b;
}

int main()
{
    int c, *dev_c;

    cudaMalloc((void **) &dev_c, sizeof(*dev_c));
    kernel<<<1,1>>>(5, 3, dev_c);
    cudaMemcpy(&c, dev_c, sizeof(*dev_c), cudaMemcpyDeviceToHost);
    cudaFree(dev_c);

    std::cout << c << std::endl;
}

根据 C++ 标准,所有函数都必须在使用之前声明(自 C99 以来的 C 语言也是如此),因此我猜测这些 CUDA header 包含在“幕后”。

这个问题是相关的,因为我想在 Visual C++ 中获得 IntelliSense 以进行 CUDA API 调用,但我没有找到任何关于此的“官方”引用。

最佳答案

我在 Linux 上对空文件运行了以下命令:

nvcc --generate-dependencies empty.cu

这产生了以下列表:

empty.o : empty.cu \
/usr/include/stdc-predef.h \
/opt/cuda/bin/..//include/cuda_runtime.h \
/opt/cuda/bin/..//include/host_config.h \
/usr/include/features.h \
/usr/include/x86_64-linux-gnu/sys/cdefs.h \
/usr/include/x86_64-linux-gnu/bits/wordsize.h \
/usr/include/x86_64-linux-gnu/gnu/stubs.h \
/usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
/opt/cuda/bin/..//include/builtin_types.h \
/opt/cuda/bin/..//include/device_types.h \
/opt/cuda/bin/..//include/host_defines.h \
/opt/cuda/bin/..//include/driver_types.h \
/usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed/limits.h \
/usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed/syslimits.h \
/usr/include/limits.h \
/usr/include/x86_64-linux-gnu/bits/posix1_lim.h \
/usr/include/x86_64-linux-gnu/bits/local_lim.h \
/usr/include/linux/limits.h \
/usr/include/x86_64-linux-gnu/bits/posix2_lim.h \
/usr/include/x86_64-linux-gnu/bits/xopen_lim.h \
/usr/include/x86_64-linux-gnu/bits/stdio_lim.h \
/usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h \
/opt/cuda/bin/..//include/surface_types.h \
/opt/cuda/bin/..//include/texture_types.h \
/opt/cuda/bin/..//include/vector_types.h \
/opt/cuda/bin/..//include/channel_descriptor.h \
/opt/cuda/bin/..//include/cuda_runtime_api.h \
/opt/cuda/bin/..//include/cuda_device_runtime_api.h \
/opt/cuda/bin/..//include/driver_functions.h \
/opt/cuda/bin/..//include/vector_functions.h \
/opt/cuda/bin/..//include/vector_functions.hpp \
/opt/cuda/bin/..//include/common_functions.h \
/usr/include/string.h \
/usr/include/xlocale.h \
/usr/include/time.h \
/usr/include/x86_64-linux-gnu/bits/time.h \
/usr/include/x86_64-linux-gnu/bits/types.h \
/usr/include/x86_64-linux-gnu/bits/typesizes.h \
/usr/include/x86_64-linux-gnu/bits/timex.h \
/usr/include/c++/4.8/new \
/usr/include/x86_64-linux-gnu/c++/4.8/bits/c++config.h \
/usr/include/x86_64-linux-gnu/c++/4.8/bits/os_defines.h \
/usr/include/x86_64-linux-gnu/c++/4.8/bits/cpu_defines.h \
/usr/include/c++/4.8/exception \
/usr/include/c++/4.8/bits/atomic_lockfree_defines.h \
/usr/include/stdio.h \
/usr/include/libio.h \
/usr/include/_G_config.h \
/usr/include/wchar.h \
/usr/lib/gcc/x86_64-linux-gnu/4.8/include/stdarg.h \
/usr/include/x86_64-linux-gnu/bits/sys_errlist.h \
/usr/include/stdlib.h \
/usr/include/x86_64-linux-gnu/bits/waitflags.h \
/usr/include/x86_64-linux-gnu/bits/waitstatus.h \
/usr/include/endian.h \
/usr/include/x86_64-linux-gnu/bits/endian.h \
/usr/include/x86_64-linux-gnu/bits/byteswap.h \
/usr/include/x86_64-linux-gnu/bits/byteswap-16.h \
/usr/include/x86_64-linux-gnu/sys/types.h \
/usr/include/x86_64-linux-gnu/sys/select.h \
/usr/include/x86_64-linux-gnu/bits/select.h \
/usr/include/x86_64-linux-gnu/bits/sigset.h \
/usr/include/x86_64-linux-gnu/sys/sysmacros.h \
/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \
/usr/include/alloca.h \
/usr/include/x86_64-linux-gnu/bits/stdlib-float.h \
/usr/include/assert.h \
/opt/cuda/bin/..//include/math_functions.h \
/usr/include/math.h \
/usr/include/x86_64-linux-gnu/bits/huge_val.h \
/usr/include/x86_64-linux-gnu/bits/huge_valf.h \
/usr/include/x86_64-linux-gnu/bits/huge_vall.h \
/usr/include/x86_64-linux-gnu/bits/inf.h \
/usr/include/x86_64-linux-gnu/bits/nan.h \
/usr/include/x86_64-linux-gnu/bits/mathdef.h \
/usr/include/x86_64-linux-gnu/bits/mathcalls.h \
/usr/include/c++/4.8/cmath \
/usr/include/c++/4.8/bits/cpp_type_traits.h \
/usr/include/c++/4.8/ext/type_traits.h \
/usr/include/c++/4.8/cstdlib \
/opt/cuda/bin/..//include/math_functions.hpp \
/opt/cuda/bin/..//include/math_functions_dbl_ptx3.h \
/opt/cuda/bin/..//include/math_functions_dbl_ptx3.hpp \
/opt/cuda/bin/..//include/cuda_surface_types.h \
/opt/cuda/bin/..//include/cuda_texture_types.h \
/opt/cuda/bin/..//include/device_functions.h \
/opt/cuda/bin/..//include/device_functions.hpp \
/opt/cuda/bin/..//include/device_atomic_functions.h \
/opt/cuda/bin/..//include/device_atomic_functions.hpp \
/opt/cuda/bin/..//include/device_double_functions.h \
/opt/cuda/bin/..//include/device_double_functions.hpp \
/opt/cuda/bin/..//include/sm_20_atomic_functions.h \
/opt/cuda/bin/..//include/sm_20_atomic_functions.hpp \
/opt/cuda/bin/..//include/sm_32_atomic_functions.h \
/opt/cuda/bin/..//include/sm_32_atomic_functions.hpp \
/opt/cuda/bin/..//include/sm_35_atomic_functions.h \
/opt/cuda/bin/..//include/sm_20_intrinsics.h \
/opt/cuda/bin/..//include/sm_20_intrinsics.hpp \
/opt/cuda/bin/..//include/sm_30_intrinsics.h \
/opt/cuda/bin/..//include/sm_30_intrinsics.hpp \
/opt/cuda/bin/..//include/sm_32_intrinsics.h \
/opt/cuda/bin/..//include/sm_32_intrinsics.hpp \
/opt/cuda/bin/..//include/sm_35_intrinsics.h \
/opt/cuda/bin/..//include/surface_functions.h \
/opt/cuda/bin/..//include/surface_functions.hpp \
/opt/cuda/bin/..//include/texture_fetch_functions.h \
/opt/cuda/bin/..//include/texture_fetch_functions.hpp \
/opt/cuda/bin/..//include/texture_indirect_functions.h \
/opt/cuda/bin/..//include/texture_indirect_functions.hpp \
/opt/cuda/bin/..//include/surface_indirect_functions.h \
/opt/cuda/bin/..//include/surface_indirect_functions.hpp \
/opt/cuda/bin/..//include/device_launch_parameters.h

因此,nvcc 默认情况下已经包含许多 CUDA header (在我的例子中位于 /opt/cuda/...)。

然后,我创建了一个包含以下内容的文件 test.cpp 并运行 g++ -H -D__CUDACC__ (以伪造 nvcc):

#include "/opt/cuda/bin/..//include/cuda_runtime.h"

这产生了以下列表:

. /opt/cuda/bin/..//include/cuda_runtime.h
.. /opt/cuda/bin/..//include/host_config.h
... /usr/include/features.h
.... /usr/include/x86_64-linux-gnu/sys/cdefs.h
..... /usr/include/x86_64-linux-gnu/bits/wordsize.h
.... /usr/include/x86_64-linux-gnu/gnu/stubs.h
..... /usr/include/x86_64-linux-gnu/gnu/stubs-64.h
.. /opt/cuda/bin/..//include/builtin_types.h
... /opt/cuda/bin/..//include/device_types.h
.... /opt/cuda/bin/..//include/host_defines.h
... /opt/cuda/bin/..//include/driver_types.h
.... /usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed/limits.h
..... /usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed/syslimits.h
...... /usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed/limits.h
....... /usr/include/limits.h
........ /usr/include/x86_64-linux-gnu/bits/posix1_lim.h
......... /usr/include/x86_64-linux-gnu/bits/local_lim.h
.......... /usr/include/linux/limits.h
........ /usr/include/x86_64-linux-gnu/bits/posix2_lim.h
........ /usr/include/x86_64-linux-gnu/bits/xopen_lim.h
......... /usr/include/x86_64-linux-gnu/bits/stdio_lim.h
.... /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h
... /opt/cuda/bin/..//include/surface_types.h
... /opt/cuda/bin/..//include/texture_types.h
... /opt/cuda/bin/..//include/vector_types.h
.... /opt/cuda/bin/..//include/builtin_types.h
..... /opt/cuda/bin/..//include/vector_types.h
.. /opt/cuda/bin/..//include/channel_descriptor.h
... /opt/cuda/bin/..//include/cuda_runtime_api.h
.... /opt/cuda/bin/..//include/builtin_types.h
.... /opt/cuda/bin/..//include/cuda_device_runtime_api.h
.. /opt/cuda/bin/..//include/driver_functions.h
... /opt/cuda/bin/..//include/builtin_types.h
.. /opt/cuda/bin/..//include/vector_functions.h
... /opt/cuda/bin/..//include/builtin_types.h
... /opt/cuda/bin/..//include/vector_functions.hpp
.... /opt/cuda/bin/..//include/builtin_types.h
.. /opt/cuda/bin/..//include/common_functions.h
... /opt/cuda/bin/..//include/builtin_types.h
... /usr/include/string.h
.... /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h
.... /usr/include/xlocale.h
... /usr/include/time.h
.... /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h
.... /usr/include/x86_64-linux-gnu/bits/time.h
..... /usr/include/x86_64-linux-gnu/bits/types.h
...... /usr/include/x86_64-linux-gnu/bits/wordsize.h
...... /usr/include/x86_64-linux-gnu/bits/typesizes.h
..... /usr/include/x86_64-linux-gnu/bits/timex.h
... /opt/cuda/bin/..//include/math_functions.h
.... /opt/cuda/bin/..//include/builtin_types.h
.... /usr/include/math.h
..... /usr/include/x86_64-linux-gnu/bits/huge_val.h
..... /usr/include/x86_64-linux-gnu/bits/huge_valf.h
..... /usr/include/x86_64-linux-gnu/bits/huge_vall.h
..... /usr/include/x86_64-linux-gnu/bits/inf.h
..... /usr/include/x86_64-linux-gnu/bits/nan.h
..... /usr/include/x86_64-linux-gnu/bits/mathdef.h
..... /usr/include/x86_64-linux-gnu/bits/mathcalls.h
..... /usr/include/x86_64-linux-gnu/bits/mathcalls.h
..... /usr/include/x86_64-linux-gnu/bits/mathcalls.h
.... /usr/include/stdlib.h
..... /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h
..... /usr/include/x86_64-linux-gnu/bits/waitflags.h
..... /usr/include/x86_64-linux-gnu/bits/waitstatus.h
...... /usr/include/endian.h
....... /usr/include/x86_64-linux-gnu/bits/endian.h
....... /usr/include/x86_64-linux-gnu/bits/byteswap.h
........ /usr/include/x86_64-linux-gnu/bits/wordsize.h
........ /usr/include/x86_64-linux-gnu/bits/byteswap-16.h
..... /usr/include/x86_64-linux-gnu/sys/types.h
...... /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h
...... /usr/include/x86_64-linux-gnu/sys/select.h
....... /usr/include/x86_64-linux-gnu/bits/select.h
........ /usr/include/x86_64-linux-gnu/bits/wordsize.h
....... /usr/include/x86_64-linux-gnu/bits/sigset.h
....... /usr/include/x86_64-linux-gnu/bits/time.h
...... /usr/include/x86_64-linux-gnu/sys/sysmacros.h
...... /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h
....... /usr/include/x86_64-linux-gnu/bits/wordsize.h
..... /usr/include/alloca.h
...... /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h
..... /usr/include/x86_64-linux-gnu/bits/stdlib-float.h
.... /usr/include/c++/4.8/cmath
..... /usr/include/x86_64-linux-gnu/c++/4.8/bits/c++config.h
...... /usr/include/x86_64-linux-gnu/c++/4.8/bits/os_defines.h
...... /usr/include/x86_64-linux-gnu/c++/4.8/bits/cpu_defines.h
..... /usr/include/c++/4.8/bits/cpp_type_traits.h
..... /usr/include/c++/4.8/ext/type_traits.h
.... /usr/include/c++/4.8/cstdlib
.... /opt/cuda/bin/..//include/math_functions.hpp
..... /opt/cuda/bin/..//include/builtin_types.h
.... /opt/cuda/bin/..//include/math_functions_dbl_ptx3.h
..... /opt/cuda/bin/..//include/math_functions_dbl_ptx3.hpp
.. /opt/cuda/bin/..//include/cuda_surface_types.h
... /opt/cuda/bin/..//include/builtin_types.h
.. /opt/cuda/bin/..//include/cuda_texture_types.h
... /opt/cuda/bin/..//include/builtin_types.h
.. /opt/cuda/bin/..//include/device_functions.h
... /opt/cuda/bin/..//include/builtin_types.h
... /opt/cuda/bin/..//include/device_functions.hpp
.... /opt/cuda/bin/..//include/builtin_types.h
... /opt/cuda/bin/..//include/device_atomic_functions.h
.... /opt/cuda/bin/..//include/builtin_types.h
.... /opt/cuda/bin/..//include/builtin_types.h
.... /opt/cuda/bin/..//include/device_atomic_functions.hpp
..... /opt/cuda/bin/..//include/builtin_types.h
..... /opt/cuda/bin/..//include/builtin_types.h
... /opt/cuda/bin/..//include/device_double_functions.h
.... /opt/cuda/bin/..//include/builtin_types.h
.... /opt/cuda/bin/..//include/device_double_functions.hpp
..... /opt/cuda/bin/..//include/builtin_types.h
... /opt/cuda/bin/..//include/sm_20_atomic_functions.h
.... /opt/cuda/bin/..//include/builtin_types.h
.... /opt/cuda/bin/..//include/sm_20_atomic_functions.hpp
..... /opt/cuda/bin/..//include/builtin_types.h
... /opt/cuda/bin/..//include/sm_32_atomic_functions.h
.... /opt/cuda/bin/..//include/builtin_types.h
.... /opt/cuda/bin/..//include/sm_32_atomic_functions.hpp
..... /opt/cuda/bin/..//include/builtin_types.h
... /opt/cuda/bin/..//include/sm_35_atomic_functions.h
... /opt/cuda/bin/..//include/sm_20_intrinsics.h
.... /opt/cuda/bin/..//include/builtin_types.h
.... /opt/cuda/bin/..//include/sm_20_intrinsics.hpp
..... /opt/cuda/bin/..//include/builtin_types.h
... /opt/cuda/bin/..//include/sm_30_intrinsics.h
.... /opt/cuda/bin/..//include/builtin_types.h
.... /opt/cuda/bin/..//include/sm_30_intrinsics.hpp
..... /opt/cuda/bin/..//include/builtin_types.h
... /opt/cuda/bin/..//include/sm_32_intrinsics.h
.... /opt/cuda/bin/..//include/builtin_types.h
.... /opt/cuda/bin/..//include/sm_32_intrinsics.hpp
..... /opt/cuda/bin/..//include/builtin_types.h
... /opt/cuda/bin/..//include/sm_35_intrinsics.h
... /opt/cuda/bin/..//include/surface_functions.h
.... /opt/cuda/bin/..//include/builtin_types.h
.... /opt/cuda/bin/..//include/surface_functions.hpp
..... /opt/cuda/bin/..//include/builtin_types.h
... /opt/cuda/bin/..//include/texture_fetch_functions.h
.... /opt/cuda/bin/..//include/builtin_types.h
.... /opt/cuda/bin/..//include/texture_fetch_functions.hpp
..... /opt/cuda/bin/..//include/builtin_types.h
... /opt/cuda/bin/..//include/texture_indirect_functions.h
.... /opt/cuda/bin/..//include/builtin_types.h
.... /opt/cuda/bin/..//include/texture_indirect_functions.hpp
..... /opt/cuda/bin/..//include/builtin_types.h
... /opt/cuda/bin/..//include/surface_indirect_functions.h
.... /opt/cuda/bin/..//include/builtin_types.h
.... /opt/cuda/bin/..//include/surface_indirect_functions.hpp
..... /opt/cuda/bin/..//include/builtin_types.h
.. /opt/cuda/bin/..//include/device_launch_parameters.h

看起来 cuda_runtime.h 包含所有其他 CUDA 相关 header 。

关于c++ - .cu 源文件中默认包含哪些 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29706730/

相关文章:

c++ - GCC 10.0.1 接受包含不在基本源字符集中的字符的 header 名称

c++ - Cuda 写入设备上的数组不会更改值

cuda - CUDA纹理对象支持3 channel 纹理吗?

windows - 指定编译器 NVCC 用于编译主机代码

c++ - new A[0] -- 合法,但有什么用?它实际上做了什么?

c++ - Windows 10 上 VS 2015 中 nupengl GLFW 的链接错误

c - CUDA 中更快的矩阵乘法

c++ - 无法编译 CUDA C 源代码。提供简易版

c - 如何使用 C 头文件和 CUDA 代码编译 C 代码?

c++ - std::function 构造函数和 nullptr