【问题标题】:Which headers are included by default in the .cu source file?.cu 源文件中默认包含哪些标头?
【发布时间】:2015-04-17 18:23:23
【问题描述】:

我想知道.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 标头包含在“幕后”。

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

【问题讨论】:

    标签: c++ cuda nvcc


    【解决方案1】:

    我在 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 标头(在我的例子中是 /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 相关的标头。

    【讨论】:

    • cuda_runtime.h 是否有可能是下面这些的“顶部标题”?我的意思是如果#include 指令的顺序与上面的相同,那么假设它可能是有意义的。在/usr/include/stdc-predef.h 的情况下,我相信这是某种不同的故事,它是在 GCC 中添加的,从 4.8 版开始。
    • 很遗憾,nvcc 不支持-H 标志,否则我们可以打印hierachy of included files。是的,我认为/usr/include/ 的标头来自 GCC。
    • 谢谢,我认为第二个列表可能会有所不同,因为有条件的#include 指令,具体取决于各种设置。例如,我的host_config.h 副本检查是否定义了__CUDACC__ 宏。如果没有,那么它会跳过一些部分。可能比我想象的要多。
    • @GrzegorzSzpetkowski:你说得对,我现在添加了-D__CUDACC__ 并得到了一个完整的列表。
    猜你喜欢
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 2017-08-19
    • 2021-11-15
    • 2014-12-24
    • 1970-01-01
    • 2011-01-15
    • 2018-01-25
    相关资源
    最近更新 更多