掘金 人工智能 08月18日
从0-1学习CUDA | week 1
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本教程旨在指导用户完成CUDA编程环境的搭建与初步验证。首先,详细回顾了CUDA C++编程所需的核心C/C++知识,包括指针、内存管理(栈与堆)以及函数传参方式。随后,分步介绍了NVIDIA CUDA Toolkit和驱动程序的安装,并提供了Windows和Linux(Ubuntu)下的具体操作指南。安装完成后,通过运行`nvidia-smi`和`nvcc --version`命令验证环境配置的正确性。最后,指导用户编译并运行CUDA自带的`deviceQuery`和`vectorAdd`示例,以确认GPU的可用性和CUDA程序的执行能力,并建议阅读《CUDA by Example》前两章以深入理解CPU与GPU协作、核函数、线程层次结构等关键概念,为后续学习打下基础。

📚 **C/C++基础巩固**:在开始CUDA编程前,必须熟练掌握指针(用于主机和设备内存地址管理)、内存管理(栈的自动管理与堆的动态分配)以及函数传参(传值、传指针、传引用)等C/C++核心概念,因为这些是CUDA编程中处理CPU与GPU之间数据交互的基础。

💻 **CUDA环境安装与验证**:用户需确保拥有NVIDIA GPU,并在官方网站下载对应操作系统的CUDA Toolkit。安装流程包括安装兼容的GPU驱动和CUDA工具包。安装完成后,通过在终端执行`nvidia-smi`检查驱动状态,以及运行`nvcc --version`确认CUDA编译器(NVCC)是否可用,以验证环境配置的成功。

🚀 **运行CUDA示例程序**:CUDA Toolkit提供了`deviceQuery`和`vectorAdd`等示例程序,用于验证安装的正确性。用户需找到示例代码,在Linux下使用`make`或在Windows下通过Visual Studio进行编译,然后运行。`deviceQuery`用于显示GPU信息,`vectorAdd`则演示了GPU上的向量加法计算。成功运行并看到“PASS”或“Test PASSED”即表示环境配置无误。

💡 **理解CUDA编程模型**:在环境就绪后,建议阅读《CUDA by Example》的前两章,重点理解CPU(Host)与GPU(Device)的角色区分、`__global__`修饰的核函数(Kernel)如何在GPU上并行执行、基本CUDA程序执行流程(内存分配、数据传输、核函数调用、结果传回、内存释放)以及CUDA的线程层次结构(Grid, Block, Thread)等核心概念。

⚙️ **CUDA编程核心流程**:一个典型的CUDA程序执行流程包括:在CPU和GPU上分配内存(`malloc/new`和`cudaMalloc`),使用`cudaMemcpy`将数据从CPU传输到GPU,调用核函数(`kernel<<<...>>>()`)在GPU上执行计算,再使用`cudaMemcpy`将结果传回CPU,最后释放CPU和GPU上的内存(`free/delete`和`cudaFree`)。

Week 1

学习目标


第 1 步:巩固 C/C++ 核心知识 (Pointers, Memory, Functions)

CUDA C++ 是 C++ 的一个扩展。在深入学习 CUDA 之前,必须对以下几个 C/C++ 概念有扎实的理解,因为您将频繁地手动管理主机(CPU)和设备(GPU)之间的内存。

1.1 指针 (Pointers)

指针是一个存储内存地址的变量。在 CUDA 中,您会用到指向 CPU 内存的指针(主机指针)和指向 GPU 内存的指针(设备指针)。

核心概念回顾:

C++

// C++ Pointer Refresher#include <iostream>void main() {    int value = 10;    int* pointerToValue = &value; // 指针存储了 value 的地址    std::cout << "Original value: " << value << std::endl;    std::cout << "Address of value (&value): " << &value << std::endl;    std::cout << "Pointer holds address: " << pointerToValue << std::endl;    // 使用指针修改值    *pointerToValue = 50;    std::cout << "New value after dereferencing: " << value << std::endl;}

1.2 内存管理 (Stack vs. Heap)

在 CUDA 中,cudaMalloc() 类似于 C 语言的 malloc(),它在 GPU 的全局内存(一种堆内存) 中分配空间。

核心概念回顾:

1.3 函数与函数指针

函数是执行特定任务的代码块。在 CUDA 中,您将编写在 GPU 上执行的特殊函数,称为“核函数 (Kernel)”。理解普通 C++ 函数的传值和传引用对于理解如何将数据传递给核函数至关重要。

核心概念回顾:

C++

// C++ Function Refresher#include <iostream>void modifyValue(int* ptr) {    *ptr = 100; // 通过指针修改原始数据}int main() {    int myVar = 5;    std::cout << "Original myVar: " << myVar << std::endl;    modifyValue(&myVar); // 传递 myVar 的地址    std::cout << "Modified myVar: " << myVar << std::endl; // 输出 100    return 0;}

第 2 步:安装 NVIDIA CUDA Toolkit 和驱动

这是最关键的一步。驱动程序让操作系统能够与 NVIDIA GPU 通信,而 CUDA Toolkit 提供了编译器(NVCC)、库和 API,让您能够编写 GPU 程序。

2.1 检查硬件

首先,确保您的计算机上有一个 NVIDIA 的 CUDA-Capable GPU。

2.2 下载 CUDA Toolkit

    访问官方网站:NVIDIA CUDA Toolkit Download根据您的操作系统(Windows, Linux, macOS)、架构 (x86_64)、发行版和版本进行选择。建议选择 network (网络) 安装程序,它会下载最新的组件。

2.3 安装步骤

2.4 验证安装

安装完成后,打开一个新的终端(或命令提示符)并运行以下命令:

    验证驱动程序:

    Bash

    nvidia-smi

    如果此命令成功运行并显示您的 GPU 信息和驱动版本,说明驱动已正确安装。

    验证 CUDA 编译器 (NVCC) :

    Bash

    nvcc --version

    此命令应显示您安装的 NVCC 编译器版本。

如果这两个命令都成功执行,您的 CUDA 环境已准备就绪!


第 3 步:运行 CUDA 示例

CUDA Toolkit 自带了许多示例代码,是验证环境和学习的最佳起点。

3.1 找到示例代码

将示例目录复制到一个您有写入权限的位置,例如您的用户主目录。

Bash

# Linuxcuda-install-samples-12.5.sh ~/cd ~/NVIDIA_CUDA-12.5_Samples/

3.2 编译并运行 deviceQuery

deviceQuery 会枚举系统中的所有 CUDA 设备并显示其属性。

    进入 deviceQuery 目录:

    Bash

    cd 1_Utilities/deviceQuery

    编译:

      Linux: 运行 makeWindows: 打开该目录下的 Visual Studio .sln 文件并生成项目。

    运行:

    Bash

    ./deviceQuery

    您应该会看到类似下面的输出,列出了您的 GPU 名称、计算能力、内存大小等。最重要的是最后一行:

    ...Device 0: "NVIDIA GeForce RTX 4080"  CUDA Driver Version / Runtime Version          12.5 / 12.5  ...Result = PASS

3.3 编译并运行 vectorAdd

vectorAdd 是一个经典的并行计算入门程序,它在 GPU 上执行两个向量的相加。

    返回示例根目录,进入 vectorAdd 目录:

    Bash

    cd ../../0_Simple/vectorAdd

    编译 (同上,make 或 Visual Studio)。1

    运行:2

    Bash

    ./vectorAdd

    如果一切正常,您会看到:3

    [Vector addition of 50000 elements]Copy input data from the host memory to the CUDA deviceCUDA kernel launch with 196 blocks of 256 threadsCopy output data from the CUDA device to the host memoryTest PASSEDDone

看到 Result = PASSTest PASSED 意味着您的 CUDA 环境和硬件工作完全正常!


第 4 步:阅读《CUDA by Example》第 1-2 章

现在您的环境已经就绪,是时候理解背后的理论了。请阅读《CUDA by Example: An Introduction to General-Purpose GPU Programming》的前两章。

关键概念总结 (Chapters 1-2)

完成以上所有步骤后,您将拥有一个正常工作的 CUDA 开发环境,并对并行计算的基本模型有了初步的了解,为后续更深入的学习奠定了坚实的基础。祝您学习顺利!

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

CUDA GPU编程 并行计算 环境配置 C++
相关文章