| 例子 | 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。住在頭。