NVIDIA/cuda-samples
GitHub: NVIDIA/cuda-samples
NVIDIA 官方维护的 CUDA 示例集合,系统展示了 CUDA Toolkit 各项功能和加速库的使用方法。
Stars: 9041 | Forks: 2305
# CUDA 示例
为 CUDA 开发者提供的示例,展示了 CUDA Toolkit 中的功能。此版本支持 [CUDA Toolkit 13.2](https://developer.nvidia.com/cuda-downloads)。
## 发行说明
本节仅描述 GitHub 上 CUDA Samples 的发行说明。
### 更新日志
### [修订历史](./CHANGELOG.md)
## 入门指南
### 前置条件
下载并安装适用于您对应平台的 [CUDA Toolkit](https://developer.nvidia.com/cuda-downloads)。
有关 cuda toolkit 的系统要求和安装说明,请参阅 [Linux 安装指南](http://docs.nvidia.com/cuda/cuda-installation-guide-linux/) 和 [Windows 安装指南](http://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/index.html)。
### 获取 CUDA Samples
使用 git 通过以下命令克隆 CUDA Samples 的仓库。
```
git clone https://github.com/NVIDIA/cuda-samples.git
```
如果不使用 git,使用这些示例最简单的方法是点击仓库页面上的“Download ZIP”按钮,下载包含当前版本的 zip 文件。然后您可以解压整个归档文件并使用这些示例。
## 构建 CUDA Samples
### 构建 CUDA Samples
CUDA Samples 使用 CMake 构建。请按照以下说明在 Linux、Windows 上构建,以及交叉编译到 Tegra 设备。
### Linux
确保已安装 CMake(3.20 或更高版本)。如有必要,请使用您的包管理器进行安装:
例如:
```sudo apt install cmake```
导航到克隆仓库的根目录并创建一个构建目录:
```
mkdir build && cd build
```
使用 CMake 配置项目:
```
cmake ..
```
构建示例:
```
make -j$(nproc)
```
从构建文件夹中它们各自的目录运行示例。您也可以在 samples 仓库的任何子目录或任何单个示例中执行此过程。
### Windows
Visual Studio 2019 16.5 或更高版本中提供了用于 CMake 的语言服务,您可以直接从根级别或从任何子目录或单个示例导入 CUDA samples 仓库。
要从命令行构建,请打开 Visual Studio 安装时提供的 `x64 Native Tools Command Prompt for VS`。
导航到克隆仓库的根目录并创建一个构建目录:
```
mkdir build && cd build
```
使用 CMake 配置项目 - 例如:
```
cmake .. -G "Visual Studio 16 2019" -A x64
```
在 Visual Studio 中打开生成的解决方案文件 CUDA_Samples.sln。通过选择所需的配置(例如,Debug 或 Release)并按 F7(Build Solution)来构建示例。
从 Visual Studio 中指定的输出目录运行示例。
### 启用 GPU 上调试
NVIDIA GPU 通过 cuda-gdb 支持 GPU 上调试。启用此功能可能会显著影响应用程序性能,因为在此配置中禁用了某些编译器优化,因此默认情况下不启用此功能。设备上调试的启用是通过向 nvcc 传递 `-G` 开关来控制的。
要为示例构建启用 cuda-gdb,请在 CMake 命令行中定义 `ENABLE_CUDA_DEBUG` 标志。例如:
```
cmake -DENABLE_CUDA_DEBUG=True ...
```
### 特定平台的示例
某些 CUDA 示例特定于某些平台,需要向 CMake 传递标志才能启用。特别是,我们定义了以下特定于平台的标志:
* `BUILD_TEGRA` - 用于 Tegra 特定的示例
要构建这些示例,请在命令行或通过您的 CMake GUI 设置变量。例如:
```
cmake -DBUILD_TEGRA=True ..
```
### 针对 Tegra 平台的交叉编译
按照 Tegra Development Guide 中的说明安装 NVIDIA 工具链和 Tegra 设备的交叉编译环境。
确保已安装 CMake(3.20 或更高版本)。
导航到克隆仓库的根目录并创建一个构建目录:
```
mkdir build && cd build
```
使用 CMake 配置项目,指定 Tegra 工具链文件。您可以使用 -DTARGET_FS 指向目标文件系统根路径,以获取必要的包含和库文件:
```
cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/toolchain-aarch64-linux.cmake -DTARGET_FS=/path/to/target/system/file/system
```
构建示例:
```
make -j$(nproc)
```
将构建的二进制文件传输到 Tegra 设备并在那里执行。
### 从 DriveOS Docker 容器针对 Automotive Linux 平台的交叉构建
要从 DriveOS Docker 容器为目标平台构建 CUDA 示例,请使用以下说明。
在容器中挂载目标根文件系统 (RFS),以便 CUDA cmake 进程具有构建示例所需的 CUDA 和其他系统库的正确路径。
创建一个临时目录,`` 是您选择的任何临时目录,例如,您可以使用 `/drive/temp`:
```
$ mkdir /drive/
```
通过运行以下命令挂载文件系统:
```
$ mount /drive/drive-linux/filesystem/targetfs-images/dev_nsr_desktop_ubuntu-24.04_thor_rfs.img /drive/temp
```
通过运行以下 cmake 命令配置项目:
```
$ mkdir build && cd build
$ cmake .. -DBUILD_TEGRA=True \
-DCMAKE_CUDA_COMPILER=/usr/local/cuda/bin/nvcc \
-DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/toolchain-aarch64-linux.cmake \
-DTARGET_FS=/drive/temp \
-DCMAKE_LIBRARY_PATH=/drive/temp/usr/local/cuda-13.1/thor/lib64/ \
-DCMAKE_INCLUDE_PATH=/drive/temp/usr/local/cuda-13.1/thor/include/
```
请注意,DriveOS dev-nsr 目标文件系统中未预装以下库:
* libdrm-dev
* Vulkan
这会导致 cmake 命令抛出与缺失文件相关的错误,结果,相关示例在后续步骤中将无法构建。此问题将在未来的 DriveOS 版本中解决。
要在忽略上述错误的情况下构建示例,您可以使用 `--ignore-errors`/`--keep-going`,或者在需要 Vulkan 和 libdrm_dev 的示例的父文件夹的 CMakeLists.txt 中注释掉相应的 `add_subdirectory` 命令:
```
$ make -j$(nproc) --ignore-errors # or --keep-going
```
```
# 在 Samples/5_Domain_Specific/CMakeList.txt 中
# add_subdirectory(simpleGL)
# add_subdirectory(simpleVulkan)
# add_subdirectory(simpleVulkanMMAP)
# 在 Samples/8_Platform_Specific/Tegra/CMakeList.txt 中
# add_subdirectory(simpleGLES_EGLOutput)
```
### QNX
在 CUDA 13.0 示例版本及更新版本中支持使用 CMake 针对 QNX 进行交叉编译。针对 Tegra Thor QNX 平台的示例构建可能如下所示:
```
$ mkdir build
$ cd build
QNX_HOST=/path/to/qnx/host \
QNX_TARGET=/path/to/qnx/target \
cmake .. \
-DBUILD_TEGRA=True \
-DCMAKE_CUDA_COMPILER=/usr/local/cuda-safe-13.0/bin/nvcc \
-DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/toolchain-aarch64-qnx.cmake \
-DCMAKE_LIBRARY_PATH=/usr/local/cuda-safe-13.0/thor/targets/aarch64-qnx/lib/stubs/ \
-DCMAKE_INCLUDE_PATH=/usr/local/cuda-safe-13.0/thor/targets/aarch64-qnx/include/
```
### 前向兼容性
要使用新的 CUDA Toolkit(CUDA 13.0 或更高版本)、UMD(版本 580 或更高版本)和旧的 KMD(版本 550 或更早版本)构建示例,您需要设置 `CMAKE_PREFIX_PATH` 以使用新的驱动程序库,命令可能如下所示:
```
cmake -DCMAKE_PREFIX_PATH=/usr/local/cuda/lib64/stubs/ ..
```
## 安装示例
### 安装路径结构
安装系统会自动将示例组织到基于以下项的结构化目录布局中:
- **目标架构**:${CMAKE_SYSTEM_PROCESSOR},例如 `x64`、`aarch64`、`amd64` 等。
- **目标操作系统**:`linux`、`windows`、`darwin`、`qnx`
- **构建类型**:`release`、`debug` 等。
默认安装路径为:`build/bin/${TARGET_ARCH}/${TARGET_OS}/${BUILD_TYPE}`
**示例:**
- Linux x86_64 Release:`build/bin/x64/linux/release`
- Linux aarch64 Release:`build/bin/aarch64/linux/release`
- Windows amd64 Release:`build/bin/amd64/windows/release`
### 自定义安装路径
您可以在配置步骤中使用 CMake 变量自定义安装位置:
- `CMAKE_INSTALL_PREFIX`:更改根安装目录(默认:`build/bin`)
cmake -DCMAKE_INSTALL_PREFIX=/custom/path ..
这将安装到:`/custom/path/${TARGET_ARCH}/${TARGET_OS}/${BUILD_TYPE}`
- `CUDA_SAMPLES_INSTALL_DIR`:指定确切的最终安装目录(覆盖结构化路径)
cmake -DCUDA_SAMPLES_INSTALL_DIR=/exact/install/path ..
### 在 Linux 上安装示例
**前置条件:**您必须首先按照 [构建 CUDA Samples - Linux](#linux) 或 [构建]部分中的说明使用 CMake 配置项目。
配置和构建后,安装示例:
```
cd build/
make install
```
### 在 Windows 上安装示例
**前置条件:**您必须首先按照 [构建 CUDA Samples - Windows](#windows) 部分中的说明使用 CMake 配置项目。
#### 使用命令行
使用 CMake 配置后,从 `x64 Native Tools Command Prompt for VS` 构建并安装:
```
cd build
cmake --build . --config Release
cmake --install . --config Release
```
**注意:**如果要安装调试版本,请将 `Release` 替换为 `Debug`。对于多配置生成器(如 Visual Studio),`--config` 标志决定要安装的构建类型。
#### 使用 Visual Studio IDE
或者,在 Visual Studio 中打开生成的解决方案文件 `CUDA_Samples.sln`:
1. 选择所需的配置(`Release` 或 `Debug`)
2. 构建解决方案(F7 或 Build > Build Solution)
3. 在 Solution Explorer 中右键单击 `CMakePredefinedTargets` 下的 `INSTALL` 目标
4. 选择“Build”
## 将所有示例作为测试运行
重要的是要注意,CUDA 示例_并非_旨在作为 CUDA 的验证套件。它们不涵盖边缘情况,不完全涵盖运行时和驱动程序 API,也不用于性能基准测试等。话虽如此,有时将所有示例作为快速的健全性检查运行是很有用的,为此我们提供了一个脚本 `run_tests.py`。
此 Python3 脚本会在您选择的子目录中查找所有可执行文件,并将应用程序名称与 `test_args.json` 中指定的命令行参数进行匹配。它接受以下命令行参数:
| 开关 | 目的 | 示例 |
| ---------- | -------------------------------------------------------------------------------------------------------------- | ----------------------- |
| --dir | 指定要(递归)搜索可执行文件的根目录 | --dir ./build/Samples |
| --config | 用于可执行文件参数的 JSON 配置文件 | --config test_args.json |
| --output | 测试结果的输出目录(stdout 保存到 .txt 文件 - 如果目录不存在将被创建) | --output ./test |
| --args | 传递给所有可执行文件的全局参数(当前未使用) | --args arg_1 arg_2 ... |
| --parallel | 并行执行的应用程序数量。 | --parallel 8 |
应用程序配置从 `test_args.json` 加载,并与可执行文件名匹配(在 Windows 上会丢弃 `.exe` 扩展名)。
脚本在成功时返回 0,在失败时返回测试期间遇到的第一个非零错误代码。如果有任何示例失败,它还将打印失败示例的简明列表。
有三种主要的配置模式:
**跳过**
配置为“skip”的可执行文件将不会被执行。这些通常依赖于连接的图形显示,不适合这种自动化。
配置示例:
```
"fluidsGL": {
"skip": true
}
```
您将看到:
```
Skipping fluidsGL (marked as skip in config)
```
**单次运行**
对于只运行一次带参数的可执行文件,请将每个参数指定为一个列表条目。JSON 文件中的每个条目将以空格分隔附加到命令行中。
所有应用程序都从其当前目录执行,因此所有路径都相对于应用程序的位置。
请注意,如果应用程序不需要参数,则此条目是可选的。如果在 JSON 中找到没有匹配条目的可执行文件,它将直接从其当前目录作为 `./application` 运行。
配置示例:
```
"ptxgen": {
"args": [
"test.ll",
"-arch=compute_75"
]
}
```
您将看到:
```
Running ptxgen
Command: ./ptxgen test.ll -arch=compute_75
Test completed with return code 0
```
**多次运行**
对于使用不同命令行参数运行多次的可执行文件,请在“runs”列表中指定任意数量的参数集。
与单次运行一样,所有应用程序都从其当前目录执行,因此所有路径都相对于应用程序的位置。
配置示例:
```
"recursiveGaussian": {
"runs": [
{
"args": [
"-sigma=10",
"-file=data/ref_10.ppm"
]
},
{
"args": [
"-sigma=14",
"-file=data/ref_14.ppm"
]
},
{
"args": [
"-sigma=18",
"-file=data/ref_18.ppm"
]
},
{
"args": [
"-sigma=22",
"-file=data/ref_22.ppm"
]
}
]
}
```
您将看到:
```
Running recursiveGaussian (run 1/4)
Command: ./recursiveGaussian -sigma=10 -file=data/ref_10.ppm
Test completed with return code 0
Running recursiveGaussian (run 2/4)
Command: ./recursiveGaussian -sigma=14 -file=data/ref_14.ppm
Test completed with return code 0
Running recursiveGaussian (run 3/4)
Command: ./recursiveGaussian -sigma=18 -file=data/ref_18.ppm
Test completed with return code 0
Running recursiveGaussian (run 4/4)
Command: ./recursiveGaussian -sigma=22 -file=data/ref_22.ppm
Test completed with return code 0
```
### 使用示例
以下是一组用于构建和测试所有示例的命令。
首先,构建:
```
mkdir build
cd build
cmake ..
make -j$(nproc)
```
现在,返回示例根目录并运行测试脚本:
```
cd ..
python3 run_tests.py --output ./test --dir ./build/Samples --config test_args.json
```
如果所有应用程序成功运行,您将看到类似以下内容(具体示例数量取决于您的构建类型和系统配置):
```
Test Summary:
Ran 199 test runs for 180 executables.
All test runs passed!
```
如果某些示例失败,您将看到类似以下内容:
```
Test Summary:
Ran 199 test runs for 180 executables.
Failed runs (2):
bicubicTexture (run 1/5): Failed (code 1)
Mandelbrot (run 1/2): Failed (code 1)
```
您可以检查输出目录中的 stdout 日志(通常是 `APM_.txt` 或 `APM_.run.txt`),以帮助从输出日志中确定可能出了什么问题。如果您认为某个示例在您的系统上错误地失败了,请在示例仓库中提交问题。
## 示例列表
### [0. 简介](./Samples/0_Introduction/README.md)
面向初学者的基本 CUDA 示例,阐明了使用 CUDA 和 CUDA 运行时 API 的关键概念。
### [1. 实用工具](./Samples/1_Utilities/README.md)
演示如何查询设备功能和测量 GPU/CPU 带宽的实用程序示例。
### [2. 概念与技术](./Samples/2_Concepts_and_Techniques/README.md)
演示 CUDA 相关概念和常见问题解决技术的示例。
### [3. CUDA 功能](./Samples/3_CUDA_Features/README.md)
演示 CUDA 功能(Cooperative Groups、CUDA Dynamic Parallelism、CUDA Graphs 等)的示例。
### [4. CUDA 库](./Samples/4_CUDA_Libraries/README.md)
演示如何使用 CUDA 平台库(NPP、NVJPEG、NVGRAPH、cuBLAS、cuFFT、cuSPARSE、cuSOLVER 和 cuRAND)的示例。
### [5. 特定领域](./Samples/5_Domain_Specific/README.md)
特定于领域(图形、金融、图像处理)的示例。
### [6. 性能](./Samples/6_Performance/README.md)
演示性能优化的示例。
### [7. libNVVM](./Samples/7_libNVVM/README.md)
演示 libNVVVM 和 NVVM IR 使用的示例。
### [8. 特定平台](./Samples/8_Platform_Specific/Tegra/README.md)
特定于某些平台(Tegra、cuDLA、NvMedia、NvSci、OpenGL ES)的示例。
## 依赖项
某些 CUDA Samples 依赖于第三方应用程序和/或库,或 CUDA Toolkit 和 Driver 提供的功能,以进行构建或执行。这些依赖项如下所列。
如果示例具有系统上可用但未安装的第三方依赖项,则该示例将在构建时自动豁免(跳过)。
每个示例的依赖项列在其 README 的依赖项部分中。
### 第三方依赖项
某些 CUDA 示例需要这些第三方依赖项。如果可用,这些依赖项要么会自动安装在您的系统上,要么可以通过系统的包管理器 或第三方网站进行安装。
#### FreeImage
FreeImage 是一个开源图像库。通常可以使用 Linux 发行版的包管理系统安装 FreeImage。也可以从 FreeImage 网站下载 FreeImage。
要在 Windows 系统上设置 FreeImage,将 FreeImage DLL 发行版解压到 `./Common/FreeImage/Dist/x64` 文件夹中,使其包含 .h 和 .lib 文件。将 .dll 文件复制到 Release/Debug 执行文件夹,或者在通过 `-DFreeImage_INCLUDE_DIR` 和 `-DFreeImage_LIBRARY` 选项配置 cmake 时传递 FreeImage 文件夹。
#### 消息传递接口
MPI (Message Passing Interface) 是一个用于在分布式进程之间通信数据的 API。可以使用 Linux 发行版的包管理系统安装 MPI 编译器。它也可在某些在线资源中找到,例如 [Open MPI](http://www.open-mpi.org/)。在 Windows 上,要构建和运行 MPI-CUDA 应用程序,可以安装 [MS-MPI SDK](https://msdn.microsoft.com/en-us/library/bb524831(v=vs.85).aspx)。
#### 仅限 64 位
某些示例只能在 64 位操作系统上运行。
#### DirectX
DirectX 是一组 API,旨在允许在 Microsoft 平台上开发多媒体应用程序。对于 Microsoft 平台,NVIDIA 的 CUDA 驱动程序支持 DirectX。一些适用于 Windows 的 CUDA 示例演示了 CUDA-DirectX 互操作性,要构建此类示例,需要安装 Microsoft Visual Studio 2012 或更高版本,该版本提供了 Microsoft Windows SDK for Windows 8。
#### DirectX12
DirectX 12 是一组高级低级编程 API,可以减少驱动程序开销,旨在允许从 Windows 10 操作系统开始在 Microsoft 平台上开发多媒体应用程序。对于 Microsoft 平台,NVIDIA 的 CUDA 驱动程序支持 DirectX。少数适用于 Windows 的 CUDA 示例演示了 CUDA-DirectX12 互操作性,要构建此类示例,需要安装 [Windows 10 SDK 或更高版本](https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk),以及 VS 2015 或 VS 2017。
#### OpenGL
OpenGL 是用于 2D 和 3D 渲染的图形库。在支持 OpenGL 的系统上,NVIDIA 的 OpenGL 实现随 CUDA 驱动程序一起提供。
#### OpenGL ES
OpenGL ES 是用于嵌入式系统的 2D 和 3D 渲染图形库。在支持 OpenGL ES 的系统上,NVIDIA 的 OpenGL ES 实现随 CUDA 驱动程序一起提供。
#### Freeglut
Freeglut 是一个开源软件库,用作原始 OpenGL Utility Toolkit (GLUT) 的替代品。其主要目的是使开发者更容易创建和管理包含 OpenGL 上下文的窗口,以及处理来自鼠标、键盘和操纵杆等设备的输入,并支持广泛的平台。要在 Windows on ARM 系统上设置 Freeglut,您需要从 [Freeglut 网站](https://freeglut.sourceforge.net/) 下载源代码,在您的系统上构建 freeglut,并将 freeglut.lib 复制到 `./Common/lib/x64` 文件夹中,将 freeglut.dll 文件复制到 `./bin/win64/${BUILD_TYPE}` 执行文件夹中。
#### Vulkan
Vulkan 是一个低开销、跨平台的 3D 图形和计算 API。Vulkan 面向高性能实时 3D 图形应用程序,例如跨所有平台的视频游戏和交互式媒体。在支持 Vulkan 的系统上,NVIDIA 的 Vulkan 实现随 CUDA 驱动程序一起提供。要构建和运行 Vulkan 应用程序,需要安装 [Vulkan SDK](https://www.lunarg.com/vulkan-sdk/)。
#### GLEW
GLEW (OpenGL Extension Wrangler Library) 是一个跨平台的开源 C/C++ 库,旨在简化使用现代 OpenGL 功能和扩展的过程。其主要功能是在运行时动态加载 OpenGL 函数指针,允许开发者访问核心 OpenGL 函数以及硬件供应商提供的称为扩展的附加功能。要在 Windows on ARM 系统上设置 GLEW,您需要从 [GLEW 网站](https://glew.sourceforge.net/) 下载源代码,在您的系统上构建 GLEW,并将 glew32.lib 复制到 `./Common/lib/x64` 文件夹中,将 glew32.dll 复制到 `./bin/win64/${BUILD_TYPE}` 执行文件夹中。
#### GLFW
GLFW 是一个轻量级的开源库,用于管理 OpenGL、OpenGL ES 和 Vulkan 上下文。它简化了以跨平台方式创建和管理窗口、处理用户输入(键盘、鼠标和操纵杆)以及使用多个显示器的过程。
要在 Windows 系统上设置 GLFW,请从 [GLFW 网站](https://www.glfw.org/download.html) 下载预构建的二进制文件,将 zip 文件解压到该文件夹中,并在配置 cmake 时将 GLFW 头文件文件夹作为 `-DGLFW_INCLUDE_DIR` 传递,将 lib 文件夹作为 `-DGLFW_LIB_DIR` 传递。
#### OpenMP
OpenMP 是一个用于多处理编程的 API。可以使用您的 Linux 发行版的包管理系统安装 OpenMP。它通常随 GCC 预装。也可以在 [OpenMP 网站](http://openmp.org/) 上找到。对于 clang 等编译器,必须单独安装 `libomp.so` 和 LLVM 的其他组件。您还需要在 CMake 配置文件中设置额外的标志,例如:`-DOpenMP_CXX_FLAGS="-fopenmp=libomp" -DOpenMP_CXX_LIB_NAMES="omp" -DOpenMP_omp_LIBRARY="/path/to/libomp.so"`。
#### Screen
Screen 是 QNX 操作系统上的窗口系统。Screen 通常作为根文件系统的一部分存在。
#### X11
X11 是常见于 *-nix 风格操作系统的窗口系统。可以使用 Linux 发行版的包管理器安装 X11,并且它预装在 Mac OS X 系统上。
#### ECUDA 示例
EGL 是 Khronos 渲染 API(如 OpenGL、OpenGL ES 或 OpenVG)与底层本地平台窗口系统之间的接口。
#### Linux
EGLOutput 是一组 EGL 扩展,允许 EGL 直接渲染到显示器。
#### Windows
EGLSync 是一组 EGL 扩展,提供属于同步原语的同步对象,表示可以测试或等待其完成的事件。
#### 在 Samples/5_Domain_Specific/CMakeList.txt 中
NvSci 是一组通信接口库,其中 CUDA 与 NvSciBuf 和 NvSciSync 进行互操作。NvSciBuf 允许应用程序在内存中分配和交换缓冲区。NvSciSync 允许应用程序管理同步对象,这些对象协调操作序列何时开始和结束。
#### add_subdirectory(simpleGL)
NvMedia 为跨 NVIDIA Tegra 设备的真正硬件加速提供了强大的多媒体数据处理能力。应用程序利用 NvMedia 应用程序编程接口 (API) 来处理图像和视频数据。
### CUDA 功能
某些 CUDA 示例需要这些 CUDA 功能。它们由 CUDA Toolkit 或 CUDA 驱动程序提供。某些功能可能在您的系统上不可用。
#### CUFFT 回调例程
CUFFT 回调例程是用户提供的内核例程,CUFFT 在加载或存储数据时将调用这些例程。这些回调例程仅在 Linux x86_64 和 ppc64le 系统上可用。
#### CUDA 动态并行
CDP (CUDA Dynamic Parallellism) 允许从 GPU 上运行的线程启动内核。CDP 仅在 SM 架构为 3.5 或更高版本的 GPU 上可用。
#### 多块协作组
Multi Block Cooperative Groups(MBCG) 扩展了协作组和 CUDA 编程模型,以表达线程块间同步。MBCG 在 Pascal 及更高架构的 GPU 上可用。
#### 多设备协作组
Multi Device Cooperative Groups 扩展了协作组和 CUDA 编程模型,使在多个 GPU 上执行的线程块能够在执行时进行协作和同步。此功能在 Pascal 及更高架构的 GPU 上可用。
#### add_subdirectory(simpleVulkan)
CUBLAS (CUDA Basic Linear Algebra Subroutines) 是 BLAS 库的 GPU 加速版本。
#### CUDA 进程间通信
IPC (Interprocess Communication) 允许进程共享设备指针。
#### add_subdirectory(simpleVulkanMMAP)
CUFFT (CUDA Fast Fourier Transform) 是一个 GPU 加速的 FFT 库。
#### 在 Samples/8_Platform_Specific/Tegra/CMakeList.txt 中
CURAND (CUDA Random Number Generation) 是一个 GPU 加速的 RNG 库。
#### add_subdirectory(simpleGLES_EGLOutput)
CUSPARSE (CUDA Sparse Matrix) 提供用于稀疏矩阵计算的线性代数子例程。
#### QNX
CUSOLVER 库是一个基于 CUBLAS 和 CUSPARSE 库的高级软件包。它在一个统一的框架下结合了三个独立的库,每个库都可以独立使用或与其他工具包库配合使用。CUSOLVER 旨在提供有用的 LAPACK 类功能,例如用于密集矩阵的通用矩阵分解和三角求解例程、稀疏最小二乘求解器和特征值求解器。此外,cuSolver 提供了一个新的重构库,可用于求解具有共享稀疏模式的矩阵序列。
#### [7. libNVVM](./Samples/7_libNVVM/README.md)
NPP (NVIDIA Performance Primitives) 提供 GPU 加速的图像、视频和信号处理功能。
#### FreeImage
NVGRAPH 是一个 GPU 加速的图分析库。
#### DirectX
NVJPEG 库为深度学习和超大规模多媒体应用中常用的图像格式提供高性能、GPU 加速的 JPEG 解码功能。
#### DirectX12
NVRTC (CUDA RunTime Compilation) 是一个用于 CUDA C++ 的运行时编译库。
#### OpenGL
NVJITLINK 是一个 CUDA 运行时库,它在运行时链接多个 GPU 设备代码对象,并启用即时链接时优化 (JIT LTO)。
它可以接收来自 NVCC 和 NVRTC 等工具的设备代码,即时链接和优化它,并生成最终的 GPU 二进制文件。有关更多详细信息,请参阅:https://docs.nvidia.com/cuda/nvjitlink/index.html
#### 流优先级
Stream Priorities 允许创建具有指定优先级的流。Stream Priorities 仅在 SM 架构为 3.5 或更高版本的 GPU 上可用。
#### 统一虚拟内存
UVM (Unified Virtual Memory) 启用可以由 CPU 和 GPU 访问的内存,而无需在两者之间进行显式复制。UVM 仅在 Linux 和 Windows 系统上可用。
#### 16 位浮点
FP16 是一种 16 位浮点格式。一位用于符号,五位用于指数,十位用于尾数。
#### OpenGL ES
NVCC 支持 [C++11 功能](https://en.wikipedia.org/wiki/C++11)。
#### Freeglut
libNVVM 示例使用 [CMake](https://cmake.org/) 3.10 或更高版本构建。
## 贡献者指南
我们欢迎您提出有关问题和示例建议的意见。目前我们不接受公众的贡献,随着我们贡献模式的发展,请随时关注这里。
我们对所有源代码使用 Google C++ 样式指南 https://google.github.io/styleguide/cppguide.html
## 常见问题解答
有关 CUDA 的常见问题解答可在 http://developer.nvidia.com/cuda-faq 和 [CUDA Toolkit 发行说明](http://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html) 中找到。
## 参考文献
* [CUDA 编程指南](https://docs.nvidia.com/cuda/cuda-programming-guide/index.html)
* [加速计算博客](https://developer.nvidia.com/blog/?tags=accelerated-computing)
## 致谢
* 茶壶图像获取自 [Wikimedia](https://en.wikipedia.org/wiki/File:Original_Utah_Teapot.jpg),并根据 Creative Commons [Attribution-Share Alike 2.0](https://creativecommons.org/licenses/by-sa/2.0/deed.en) 通用许可证获得许可。该图像已针对示例用例进行了修改。
标签:Bash脚本, C++, CMake, CUDA, CUDA Toolkit, DNS解析, GPU编程, UML, Vectored Exception Handling, 代码示例, 图形处理器, 官方示例, 客户端加密, 并行计算, 开发者资源, 开源项目, 异构计算, 技术文档, 数据分析, 数据擦除, 深度学习基础, 示例代码, 逆向工具, 高性能计算