并行性
大部分现代处理器使用的是哈佛结构:CPU(包括运算逻辑单元和控制单元)、指令存储和数据存储分离、以及IO接口。

并行性分为:
- 数据并行性:当可以同时处理许多数据时,就是数据并行。重点在于利用多核系统对数据进行分配。
- 任务并行性:当许多函数或任务可以独立大规模并行执行就是任务并行。重点在于多核系统对任务进行分配。
数据并行程序设计第一步是数据划分,分为:
-
块划分:一组连续的数据被分到同一个块中,每个数据块以任意次序被安排给一个线程,线程通常在同一个时间内只处理一个数据块。
-
周期划分:更少的数据被分到一个数据块内,相邻的线程处理相邻的数据块,每个线程可以处理多个数据块。为一个待处理的线程选择一个新的块,意味着要跳过和现有线程一样多的数据块。

计算架构
延迟:一个操作从开始到结束需要的时间ms
带宽:单位时间内可处理的最大数据量MB/s或GB/s
吞吐量:单位时间成功处理的运算数量gfops
根据指令和数据进入cpu的方式将计算机架构分为四类:SISD、SIMD(并行架构)、MISD、MIMD(并行架构)
GPU是SIMT(单指令多线程)
根据内存的组织方式可分为:
分布式内存的多节点系统:

共享内存的多处理器系统:

cpu常用来处理复杂的逻辑控制,优化串行程序执行;GPU用来优化简单控制逻辑的数据并行任务,注重并行程序的吞吐量。
异构计算
在同一个计算系统下,使用不同类型、不同架构的处理器协同工作共同完成计算任务的技术范式。
典型的现代计算机使用CPU和GPU的异构架构

GPU容量的两个重要特征:gpu核心数量,gpu内存大小;
GPU性能评估指标:峰值计算性能,内存带宽
异构计算范例:

cuda是一种异构计算平台,使用cuda c编程需要编写host(CPU)和device代码(GPU,常使用runtime api)。nvcc编译器会将程序的host和device代码分开:

cuda编程简单语法

global #这个修饰符告诉编译器函数从cpu调用在gpu执行

三重尖括号意味着从主线程到设备端代码的调用。一个内核函数通过一组线程来执行,所有线程执行相同的代码。
cuda编程的过程:
cuda编程有内存层次结构和线程层次结构,可以进行优化。
习题
现象与分析:
没有gpu打印的输出,没有等待gpu运行完成程序进行了返回。cudaDeviceReset函数的作用如下:
cudaDeviceReset();
// ✅ 1. 隐式调用 cudaDeviceSynchronize() – 等待 GPU 完成
// ✅ 2. 清理 CUDA 上下文和资源
// ✅ 3. 重置设备状态(用于多次初始化的场景)
现象与分析:成功打印了正确的内容。
cudaDeviceRest和cudaDeviceSynchronize对比:
cudaDeviceRest核弹级清理:
1. 隐式同步(等待完成)
2. 销毁 CUDA 上下文
3. 释放所有显存资源
cudaDeviceSynchronize纯等待:
1. 阻塞 CPU,直到 GPU 上所有之前的任务(包括 Kernel 和其中的 printf)全部完成。
2. 不销毁上下文。

看看会发生什么:
现象与分析:成功打印了正确的内容。
但是运行nsight发现相对于加了arch_sm86标志的有一个长串的标红,有大神可以解释一下原因吗?
添加架构标志的:

未添加的:

现象与分析:查阅官方文档得到以下表格:

最常见的就是.cu文件了。

现象与分析:

将print行修改成以下即可:
printf("Hello CUDA from GPU! Thread %d\\n", threadIdx.x); // 输出线程ID,展示并行执行
撒花,第一章学习完毕。






