面向 CUDA 开发人员的示例,演示了 CUDA 工具包中的功能。该版本支持 CUDA 工具包 12.5。
本节仅介绍 GitHub 上 CUDA 示例的发行说明。
下载并安装适用于您相应平台的 CUDA Toolkit 12.5。有关cuda工具包的系统要求和安装说明,请参阅Linux安装指南和Windows安装指南。
使用 git 使用以下命令克隆 CUDA 示例的存储库。
git clone https://github.com/NVIDIA/cuda-samples.git
如果不使用 git,使用这些示例的最简单方法是通过单击存储库页面上的“下载 ZIP”按钮来下载包含当前版本的 zip 文件。然后,您可以解压缩整个存档并使用示例。
Windows 示例是使用 Visual Studio IDE 构建的。为每个受支持的 Visual Studio 版本提供解决方案文件 (.sln),使用以下格式:
*_vs<version>.sln - for Visual Studio <version>
完整的示例解决方案文件存在于存储库的父目录中:
每个单独的示例都有自己的一组解决方案文件,位于: <CUDA_SAMPLES_REPO>Samples<sample_dir>
要立即构建/检查所有示例,应使用完整的解决方案文件。要构建/检查单个样本,应使用单独的样本解决方案文件。
Linux 示例是使用 makefile 构建的。要使用 makefile,请将当前目录更改为您要构建的示例目录,然后运行 make:
$ cd <sample_dir>
$ make
示例 makefile 可以利用某些选项:
TARGET_ARCH= - 针对特定架构的交叉编译。允许的架构包括 x86_64、ppc64le、armv7l、aarch64。默认情况下,TARGET_ARCH 设置为 HOST_ARCH。在 x86_64 计算机上,不设置 TARGET_ARCH 相当于设置 TARGET_ARCH=x86_64。
$ make TARGET_ARCH=x86_64
$ make TARGET_ARCH=ppc64le
$ make TARGET_ARCH=armv7l
$ make TARGET_ARCH=aarch64
有关 cuda 示例跨平台编译的更多详细信息,请参阅此处。
dbg=1 - 使用调试符号构建
$ make dbg=1
SMS="AB ..." - 覆盖将为其构建示例的 SM 架构,其中"AB ..."
是由空格分隔的 SM 架构列表。例如,要为 SM 50 和 SM 60 生成 SASS,请使用SMS="50 60"
。
$ make SMS="50 60"
HOST_COMPILER=<host_compiler> - 覆盖默认的 g++ 主机编译器。有关受支持的主机编译器的列表,请参阅 Linux 安装指南。
$ make HOST_COMPILER=g++
面向初学者的基本 CUDA 示例,说明使用 CUDA 和 CUDA 运行时 API 的关键概念。
演示如何查询设备功能和测量 GPU/CPU 带宽的实用程序示例。
演示 CUDA 相关概念和常见问题解决技术的示例。
演示 CUDA 功能的示例(协作组、CUDA 动态并行性、CUDA 图等)。
演示如何使用 CUDA 平台库(NPP、NVJPEG、NVGRAPH cuBLAS、cuFFT、cuSPARSE、cuSOLVER 和 cuRAND)的示例。
特定于领域(图形、金融、图像处理)的示例。
展示性能优化的示例。
演示 libNVVVM 和 NVVM IR 用法的示例。
一些 CUDA 示例依赖第三方应用程序和/或库,或 CUDA 工具包和驱动程序提供的功能来构建或执行。下面列出了这些依赖项。
如果示例具有系统上可用但未安装的第三方依赖项,则该示例将在构建时放弃自身。
每个示例的依赖项都列在其自述文件的依赖项部分中。
某些 CUDA 示例需要这些第三方依赖项。如果可用,这些依赖项会自动安装在您的系统上,或者可通过系统的包管理器 (Linux) 或第三方网站安装。
FreeImage 是一个开源图像库。 FreeImage 通常可以使用发行版的包管理器系统安装在 Linux 上。 FreeImage 也可以从 FreeImage 网站下载。
要在 Windows 系统上设置 FreeImage,请将 FreeImage DLL 发行版提取到文件夹../../../Common/FreeImage/Dist/x64
中,使其包含 .h 和 .lib 文件。将 .dll 文件复制到根级别bin/win64/Debug
和bin/win64/Release
文件夹。
MPI(消息传递接口)是用于在分布式进程之间通信数据的 API。可以使用 Linux 发行版的包管理器系统来安装 MPI 编译器。某些在线资源(例如 Open MPI)上也提供了它。在 Windows 上,要构建和运行 MPI-CUDA 应用程序,可以安装 MS-MPI SDK。
某些示例只能在 64 位操作系统上运行。
DirectX 是一组 API,旨在允许在 Microsoft 平台上开发多媒体应用程序。对于 Microsoft 平台,NVIDIA 的 CUDA 驱动程序支持 DirectX。多个适用于 Windows 的 CUDA 示例演示了 CUDA-DirectX 互操作性,要构建此类示例,需要安装 Microsoft Visual Studio 2012 或更高版本,该版本提供适用于 Windows 8 的 Microsoft Windows SDK。
DirectX 12 是高级低级编程 API 的集合,可以减少驱动程序开销,旨在允许从 Windows 10 操作系统开始在 Microsoft 平台上开发多媒体应用程序。对于 Microsoft 平台,NVIDIA 的 CUDA 驱动程序支持 DirectX。很少有适用于 Windows 的 CUDA 示例展示了 CUDA-DirectX12 互操作性,要构建此类示例,需要安装 Windows 10 SDK 或更高版本以及 VS 2015 或 VS 2017。
OpenGL 是用于 2D 和 3D 渲染的图形库。在支持 OpenGL 的系统上,NVIDIA 的 OpenGL 实现随 CUDA 驱动程序一起提供。
OpenGL ES 是一个用于 2D 和 3D 渲染的嵌入式系统图形库。在支持 OpenGL ES 的系统上,NVIDIA 的 OpenGL ES 实现随 CUDA 驱动程序一起提供。
Vulkan 是一种低开销、跨平台的 3D 图形和计算 API。 Vulkan 面向高性能实时 3D 图形应用程序,例如跨所有平台的视频游戏和交互式媒体。在支持 Vulkan 的系统上,NVIDIA 的 Vulkan 实现随 CUDA 驱动程序一起提供。为了构建和运行 Vulkan 应用程序,需要安装 Vulkan SDK。
OpenMP 是一个用于多处理编程的 API。可以使用 Linux 发行版的包管理器系统来安装 OpenMP。它通常预装了 GCC。也可以在 OpenMP 网站上找到它。
Screen 是 QNX 操作系统上的一个窗口系统。 Screen 通常是根文件系统的一部分。
X11 是一种常见于 *-nix 风格操作系统的窗口系统。 X11 可以使用 Linux 发行版的包管理器进行安装,并且预装在 Mac OS X 系统上。
EGL 是 Khronos 渲染 API(例如 OpenGL、OpenGL ES 或 OpenVG)与底层本机平台窗口系统之间的接口。
EGLOutput 是一组 EGL 扩展,允许 EGL 直接渲染到显示器。
EGLSync 是一组 EGL 扩展,它提供作为同步原语的同步对象,表示可以测试或等待其完成的事件。
NvSci 是一组通信接口库,其中 CUDA 可以与 NvSciBuf 和 NvSciSync 进行互操作。 NvSciBuf 允许应用程序分配和交换内存中的缓冲区。 NvSciSync 允许应用程序管理同步对象,这些对象在操作序列开始和结束时进行协调。
NvMedia 提供强大的多媒体数据处理能力,可在 NVIDIA Tegra 设备上实现真正的硬件加速。应用程序利用 NvMedia 应用程序编程接口 (API) 来处理图像和视频数据。
一些 CUDA 示例需要这些 CUDA 功能。它们由 CUDA 工具包或 CUDA 驱动程序提供。某些功能可能在您的系统上不可用。
CUFFT 回调例程是用户提供的内核例程,CUFFT 在加载或存储数据时将调用它们。这些回调例程仅在 Linux x86_64 和 ppc64le 系统上可用。
CDP(CUDA 动态并行)允许从 GPU 上运行的线程启动内核。 CDP 仅适用于 SM 架构 3.5 或更高版本的 GPU。
多块协作组 (MBCG) 扩展了协作组和 CUDA 编程模型以表达线程间块同步。 MBCG 可在 Pascal 及更高架构的 GPU 上使用。
多设备协作组扩展了协作组和 CUDA 编程模型,使在多个 GPU 上执行的线程块能够在执行时进行协作和同步。此功能可在 Pascal 及更高架构的 GPU 上使用。
CUBLAS(CUDA 基本线性代数子例程)是 BLAS 库的 GPU 加速版本。
IPC(进程间通信)允许进程共享设备指针。
CUFFT(CUDA 快速傅里叶变换)是一个 GPU 加速的 FFT 库。
CURAND(CUDA 随机数生成)是一个 GPU 加速的 RNG 库。
CUSPARSE(CUDA稀疏矩阵)提供用于稀疏矩阵计算的线性代数子例程。
CUSOLVER 库是基于 CUBLAS 和 CUSPARSE 库的高级包。它将三个独立的库组合在一个框架下,每个库都可以独立使用或与其他工具包库配合使用。 CUSOLVER 的目的是提供有用的类似 LAPACK 的功能,例如密集矩阵的常见矩阵分解和三角求解例程、稀疏最小二乘求解器和特征值求解器。此外,cuSolver 还提供了一个新的重构库,可用于求解具有共享稀疏模式的矩阵序列。
NPP(NVIDIA Performance Primitives)提供GPU加速的图像、视频和信号处理功能。
NVGRAPH 是一个 GPU 加速的图形分析库。
NVJPEG 库为深度学习和超大规模多媒体应用中常用的图像格式提供高性能、GPU 加速的 JPEG 解码功能。
NVRTC(CUDA RunTime Compilation)是CUDA C++的运行时编译库。
流优先级允许创建具有指定优先级的流。流优先级仅适用于 SM 架构为 3.5 或更高版本的 GPU。
UVM(统一虚拟内存)使 CPU 和 GPU 都可以访问内存,而无需在两者之间进行显式复制。 UVM 仅适用于 Linux 和 Windows 系统。
FP16 是一种 16 位浮点格式。一位用于符号,五位用于指数,十位用于尾数。
NVCC 支持 C++11 功能。
libNVVM 示例是使用 CMake 3.10 或更高版本构建的。
我们欢迎您提出有关样品问题和建议的意见。目前,我们不接受公众的贡献,请在我们改进贡献模型时回来查看。
我们对所有源使用 Google C++ 样式指南 https://google.github.io/styleguide/cppguide.html
有关 CUDA 的常见问题解答可以在 http://developer.nvidia.com/cuda-faq 和 CUDA 工具包发行说明中找到。