2015-04-17 38 views
2

我想知道.cu編譯單元中隱含包含哪些標題。舉例來說,我們需要一些基本的例子:默認情況下,.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頭都包含「背後的李宗紅」。

這個問題是相關的,因爲我想在CUDA API調用的Visual C++中獲得IntelliSense,我還沒有發現任何「官方」參考。

回答

4

我跑以下命令在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相關頭文件。

+0

有可能'cuda_runtime.h'是下面這些的「頂部標題」嗎?我的意思是,如果'#include'指令的順序與上述相同,那麼假設這可能是有道理的。在'/ usr/include/stdc-predef.h'的情況下,我認爲這是一種不同的故事,自從4.8版以後,它被添加到GCC中。 –

+0

不幸的是,nvcc不支持'-H'標誌,否則我們可能會打印[包含文件的層次](http://stackoverflow.com/a/6685693/678093)。是的,我認爲來自'/ usr/include /'的頭文件來自GCC。 –

+0

謝謝,我認爲第二個列表可能會因爲有條件的'#include'指令而有所不同,具體取決於各種設置。例如我的'host_config.h'副本檢查是否定義了'__CUDACC__'宏。如果沒有,那麼它跳過一些部分。有可能比我想象的要多。 –

相關問題