| 例子 | Godbolt | 文档 |
|---|
libcu ++,NVIDIA C ++标准库,是整个系统的C ++标准库。它提供了可以在CPU和GPU代码之间使用的C ++标准库的异质实现。
如果您知道如何使用C ++标准库,那么您就会知道如何使用libcu ++。您要做的就是将cuda/std/添加到标准库的开始中,并且cuda:: std::
# include < cuda/std/atomic >
cuda::std::atomic< int > x;NVIDIA C ++标准库是一个开源项目;它可在GitHub上找到,并包含在NVIDIA HPC SDK和CUDA工具包中。如果您安装了其中一个SDK,则不需要其他安装或编译器标志来使用libcu ++。
cuda::和cuda::std::与NVCC一起使用时,NVIDIA C ++标准库设施将生活在其自己的标题层次结构和名称空间中,其结构与主机编译器的标准库相同但与众不同:
std:: / <*> :使用NVCC时,这是您的主机编译器的标准库,仅在__host__代码中起作用,尽管您可以使用--expt-relaxed-constexpr flag在__device__ code中使用任何constexpr函数。使用NVCC,Libcu ++不会替换或干扰主机编译器的标准库。cuda::std:: / <cuda/std/*> :严格符合在__host__ __device__ code中使用的标准库中设施的实现。cuda:: / <cuda/*> :将扩展程序符合到__host__ __device__ code中的标准库。cuda::device / <cuda/device/*> :将扩展程序符合到仅在__device__代码中工作的标准库。 // Standard C++, __host__ only.
# include < atomic >
std::atomic< int > x;
// CUDA C++, __host__ __device__.
// Strictly conforming to the C++ Standard.
# include < cuda/std/atomic >
cuda::std::atomic< int > x;
// CUDA C++, __host__ __device__.
// Conforming extensions to the C++ Standard.
# include < cuda/atomic >
cuda::atomic< int , cuda::thread_scope_block> x;NVIDIA C ++标准库在您的整个代码库中工作,无论是在主机和设备代码中。 libcu ++是整个系统的C ++标准库,而不仅仅是您的CPU或GPU。 cuda::的所有内容都是__host__ __device__
LIBCU ++设施设计为在主机和设备代码之间传递。除非另有说明,否则可以在主机和设备代码之间复制或移动的任何可复制或可移动的libcu ++对象。
同步对象跨主机和设备代码工作,可用于在主机和设备线程之间同步。但是,有一些限制要注意。有关更多详细信息,请参阅“同步原语”部分。
cuda::device::少数LIBCU ++设施仅在设备代码中起作用,通常是因为主机代码中没有明智的实现。
此类设施生活在cuda::device:: 。
如今,NVIDIA C ++标准库今天提供了C ++标准库的高优先级子集,并且每个版本都会增加功能集。但这是一个子集;今天并非所有内容都可用。标准API部分列出了可用的设施及其首次引入的版本。
NVIDIA C ++标准库是在GitHub上开发的开源项目。这是NVIDIA的LLVM LIBC ++的变体。 LIBCU ++分布在Apache许可证v2.0下,具有LLVM异常。
NVIDIA C ++标准库的目标是符合C ++标准的实现,ISO/IEC IS IS 14882,第16至32条。
NVIDIA C ++标准库无法保持长期的ABI稳定性。有希望的长期ABI稳定性将阻止我们解决错误并在课堂表现方面提供最佳状态。因此,我们没有做出这样的承诺。
每个主要的CUDA工具包,ABI都会被打破。 ABI版本的生命周期大约一年。大约两年后,对ABI版本的长期支持结束。有关更多详细信息,请参阅版本范围。
我们建议您始终使用最新的NVIDIA SDK重新编译代码和依赖项,并使用最新的NVIDIA C ++标准库ABI。住在头。