设为首页 加入收藏

TOP

《CUDA编程:基础与实践》读书笔记(1):CUDA编程基础(一)
2023-09-09 10:25:55 】 浏览:318
Tags:CUDA 编程 程基础

1. GPU简介

GPU与CPU的主要区别在于:

  • CPU拥有少数几个快速的计算核心,而GPU拥有成百上千个不那么快速的计算核心。
  • CPU中有更多的晶体管用于数据缓存和流程控制,而GPU中有更多的晶体管用于算数逻辑单元。

所以,GPU依靠众多的计算核心来获得相对较高的并行计算性能。

一块单独的GPU无法独立地完成所有计算任务,它必须在CPU的调度下才能完成特定任务,因此当我们讨论GPU计算时,其实指的是CPU+GPU的异构计算。通常将起控制作用的CPU称为主机(host),起加速作用的GPU称为设备(device),它们之间一般采用PCIe总线连接。

NVIDIA公司出品的GPU中,支持CUDA(Compute Unified Device Architecture)编程的系列如下:

  • Tesla系列:主要用于科学计算。
  • Quadro系列:主要用于专业绘图设计。
  • GeForce系列:主要用于游戏与娱乐。
  • Jetson系列:主要用于嵌入式设备。

每款GPU都有一个计算能力(compute capability),写为形如X.Y的形式。计算能力决定了GPU硬件所支持的功能,它与性能不是简单的正比关系。下表列出了部分计算能力及其架构代号与发布年份,详细的GPU计算能力信息可以查阅官方网站:https://developer.nvidia.com/cuda-gpus

计算能力 架构代号 发布时间
X = 1 Tesla(特斯拉) 2006
X = 2 Fermi(费米) 2010
X = 3 Kepler(开普勒) 2012
X = 5 Maxwell(麦克斯韦) 2014
X = 6 Pascal(帕斯卡) 2016
X.Y = 7.0 Volta(伏特) 2017
X.Y = 7.5 Turing(图灵) 2018
X.Y = 8.6 Ampere(安培) 2020
X.Y = 8.9 Ada(阿达) 2022

表征GPU性能的一个重要参数是每秒浮点运算次数(floating-point operations per second,FLOPS),其数值通常在1012量级,即teraFLOPS(TFLOPS)。浮点运算有单精度和双精度之分,双精度浮点运算速度通常小于单精度浮点运算速度,对于Tesla系列GPU来说其比例一般是1/2左右,对于GeForce系列GPU来说其比例一般是1/32左右。另一个影响GPU性能的重要参数是显存带宽,它限制了显卡芯片与显存之间的数据交换速率。

CUDA官方文档包含了安装指南、编程指南、API手册、工具介绍等内容,网址是:https://docs.nvidia.com/cuda/

安装完CUDA开发工具后,可以在命令行中执行nvidia-smi来查看设备信息。

PS C:\> nvidia-smi
Wed Apr 19 21:53:50 2023
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 531.14                 Driver Version: 531.14       CUDA Version: 12.1     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                      TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf            Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce RTX 3060 L...  WDDM | 00000000:01:00.0  On |                  N/A |
| N/A   47C    P8               13W /  N/A|    737MiB /  6144MiB |      1%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|    0   N/A  N/A      9236    C+G   C:\Windows\explorer.exe                   N/A      |
+---------------------------------------------------------------------------------------+

2. 运行时API

CUDA提供了两层API供程序员使用,分别是CUDA驱动(driver)API和CUDA运行时(runtime)API。其中,驱动API较为底层,它虽然编程接口更加灵活但编程难度更高,例如cuCtxCreate()cu开头的函数;运行时API则在驱动API的基础上进行了封装,更加容易使用,例如cudaMalloc()cuda开头的函数。CUDA运行时API中没有显式初始化设备的函数,在第一次调用一个和设备管理/版本查询功能无关的运行时API时,设备将自动初始化。

下面是一段利用CUDA运行时API进行数组相加的程序,它体现了一个CUDA程序的基本编程框架。

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <cstdlib>

// CUDA核函数的定义
void __global__ add(const double* x, const double* y, double* z)
{
    const int n = blockDim.x * blockIdx.x + threadIdx.x;
    z[n] = x[n] + y[n];
}

int main()
{
    // 分配主机内存、初始化数据
    const int N = 100000000;
    const int M = sizeof(double) * N;
    double* h_x = (double*)malloc(M);
    double* h_y = (double*)malloc(M);
    double* h_z = (double*)malloc(M);
    for (int n = 0; n < N; ++n)
    {
        h_x[n] = 1.23;
        h_y[n] = 4.56;
    }

    // 分配设备内存、把主机数据复制到设
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇7.4 通过API枚举进程权限 下一篇一个简单的spdlog使用示例

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目