【C++】CUDA期末复习指南上(详细)

这篇具有很好参考价值的文章主要介绍了【C++】CUDA期末复习指南上(详细)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🍎 博客主页:🌙@披星戴月的贾维斯
🍎 欢迎关注:👍点赞🍃收藏🔥留言
🍇系列专栏:🌙 C/C++专栏
🌙请不要相信胜利就像山坡上的蒲公英一样唾手可得,但是请相信,世界上总有一些美好值得我们全力以赴,哪怕粉身碎骨!🌙
🍉一起加油,去追寻、去成为更好的自己!

【C++】CUDA期末复习指南上(详细)

提示:以下是本篇文章正文内容,下面案例可供参考


前言

    现在也已经有很多学校陆陆续续进入到了考试月,想必不少同学和我一样在准备期末考,提前祝贺大家在期末考中都能取得自己满意的成绩,现在我和和大家一起分享一篇CUDA期末复习指南,希望对大家有帮助。

🍎1、早期的GPU编程

GPU图形处理器Graphics Processing Unit,是现在常用的设备。
提供一些基本的操作,对内存中的图像着色,显示在屏幕上。
GPU会处理一个复杂的多边形集合,即需要着色的图片映像,然后给这些多边形图上纹理,在进行光照和阴影处理。
一个重要的进步:可编程着色器programmable shader,GPU运行一些用来计算图片效果的小程序。GPU中的着色器就不是固定的,可以通过下载不同的着色器,来进行着色。这就是最初的通用图形处理器General Purpose Graphical Processor Unit, GPGPU。
GPU处理单元功能不再是固定的,CUDA是首次实现了可编程显卡,向程序员提供了一个真正通用的GPU编程语言。

GPU的基本架构以及与CPU的交互
【C++】CUDA期末复习指南上(详细)
解释:一个GPU内有许多流处理器簇(Streaming Multiprocessor,SM),类似CPU的核。
SM和共享存储(一级缓存)连接在一起,然后又与相当于SM间互联开关的二级缓存相连。
数据先是在主机的全局存储中,然后被主机取出并使用。主机将数据通过PCI-E互联开关直接送往GPU的存储空间。PCI-E互联开关的传输速度比任何一个互联网快很多。

流处理器SM内部组成结构图
【C++】CUDA期末复习指南上(详细)


🍎2、串行/并行问题 并发性 局部性

🍇并行程序标准

两个并行程序设计标准,OpenMP和MPI
线程模型比较适合OpenMP,进程模式适用于MPI。
在GPU环境下,就需要混合在一起。CUDA使用一个线程块(block)构成的网格(grid)。可以看成是一个进程(线程块)组成的队列(网格),进程间没有通讯。每个进程(线程块)内部有很多线程,这些线程以批处理的方式运行,成为线程束(warp)。

🍇并发性

首要内涵是,对于一个特定的问题,不考虑那种并行架构,只关注求解方法中哪些操作是可以并行执行的。

算法中可能会有一段不易并行的阶段,被称为瓶颈

CUDA将问题分解成线程块的网格,每块包含多个线程。块可以按照任意顺序执行,易并行问题,块容易按照任意顺序执行

线程网格(grid)->线程块(block)->线程(thread)
【C++】CUDA期末复习指南上(详细)

网格中的块可以被分配到任意一个有空闲槽的SM上。可以采用轮询调度策略,确保分配到每个SM上的块数基本相同。对于大部分内核程序而言,分块的数量应该是GPU中物理SM数量的八倍或者更多倍。

🍇局部性

计算性能的提高已经从受限于处理器运算吞吐率,发展到迁移数据成为首要限制因素。
局部性问题通过多级缓存来解决。当任务被多次重复执行,缓存作用会充分发挥。
工作基础是空间局部性和时间局部性。之前被访问过的数据很可能还要被再次访问(时间局部性);刚被访问过的数据附近的数据也很可能马上被访问到(空间局部性)。

脏数据指的是缓存中被程序修改过的数据。脏数据必须在新数据装入前写回到全局内存,也就是说如果需要全局内存访问,需要先把缓存中的数据写回到内存中,再访问内存数据。


🍎3、任务/数据并行

🍇任务并行

操作系统,多任务
操作系统,它实现的是一种任务并行的并行处理,各个进程是不同的、无关的。多个CPU核心运行不同的应用程序。
基于任务的并行适合于粗粒度的并行。
就GPU而言,粗粒度并行处理是由GPU卡和CPU内核程序来执行。GPU有两种方法来支持流水线并行处理模式。一是,若干个内核程序被一次排列成一个执行流,然后不同的执行流并发执行。二是,多个GPU协同工作,可以通过主机或者PCI-E总线,在不同GPU之间传递数据。

🍇数据并行:

关注数据及其所需的变换,不是待执行的任务
基于数据的并行适合于细粒度的并行。

弗林分类法

SIMD (Single Instruction Multiple Data)单指令多数据
MIMD (Multiple Instruction Multiple Data)多指令多数据
SISD (Single Instruction Single Data)单指令单数据
MISD (Multiple Instruction Single Data)多指令单数据

**常用的并行模式:
循环
派生/汇聚:先串行,然后遇到并行区,并行处理,然后再汇聚串行处理。采用数据的静态划分来实现常用于并发事件数量事先不确定的问题。遍历树形结构,路径搜索等。
分条/分块:绝大多数并行处理方法。比如:矩阵计算大气海洋模型
分而治之:把大问题分解称小问题
**

🍎4、GPU硬件结构

4.1🍇内存的分类

内存类型 访问权限
全局内存 可读可写
常量内存 仅可读
纹理内存 一般仅可读
寄存器内存 可读可写
局部内存 可读可写
共享内存 可读可写

GPU有流处理器簇、流处理器。
GPU实际上是一个SM的阵列,每个SM包含N个核
一个GPU设备包含多个SM,这是GPU具有可扩展性的关键因素。
每个SM有一个寄存器文件,是能够以与SP相同速度工作的存储单元。不同型号GPU,寄存器文件大小不相同,用来存储SP上运行的线程内部活跃的寄存器。
每个SM内部访问的共享内存,是程序可控的高速缓存。与CPU内部的高速缓存不同,没有自动完成数据替换的硬件逻辑,完全由程序控制。

每个SM都设置有总线访问纹理内存、常量内存、全局内存。
纹理内存是针对全局内存的特殊视图,用来存储差值计算所需的数据
常量内存存储只读数据。

每个SM还有两个以上的专用单元(Special-Purpose Unit, SPU),SPU专门执行诸如正弦余弦函数/指数函数操作等特殊硬件指令。

内核函数:global void kernel<<<1, 1>>>();
__global__告诉编译器,这个函数可以在设备上运行的。
<<<一个线程块,每个线程块一个线程>>>
<<<gridDim, blockDim>>>(具体的函数传参)

cuda设备属性
【C++】CUDA期末复习指南上(详细)

🍎5、GPU与CPU差别

任务/数据并行:
GPU与CPU在缓存上的一个重要差别是缓存一致性”问题。
缓存一致性系统,一个内存写操作需要通知所有核的各个级别缓存,所有核看到的内存视图是一样的。随着核数量增多,通知的开销迅速增大,限制了一个处理器中的核数量不能太多。
非缓存一致系统,系统不会自动更新其他核的缓存。需要程序员写清楚每个处理器核输出的各自不同的目标区域。从程序角度,这支持一个核只负责一个输出或者一个小的输出集。
CPU一般缓存一致,GPU是非缓存一致的,因此GPU可以在一个芯片内有大量的核心。

GPU的方式,对于多数据的处理方式更灵活;CPU只能用指令集里固化的数据处理方式。


🍎6、GPU函数

  1. cudaMalloc:cudaMalloc 是CUDA中的一个函数,用于在设备端(GPU)分配一段内存空间。第一个参数是地址的二重指针,我们可以强制转换为(void**)类型的,第二个参数是申请的地址大小。
    举例:
HANDLE_ERROR( cudaMalloc( (void**) &dev_a, N * sizeof(int) ) );
  1. cudaMemcpy:cudaMemcpy 是 CUDA 中用于在主机(CPU)和设备(GPU)之间进行内存数据传输的函数。它的函数原型如下:
cudaError_t cudaMemcpy(
void *dst,
const void *src,
size_t count,
cudaMemcpyKind kind
);

dst 为目标内存地址,在数据传输过程中将接收数据; src 是源内存地址,数据将从这里传输到目标地址; count 是要传输的数据字节数; kind 是传输数据的方式。
cudaMemcpyHostToHost :从主机复制数据到主机;
cudaMemcpyHostToDevice :从主机复制数据到设备;
cudaMemcpyDeviceToHost :从设备复制数据到主机;
cudaMemcpyDeviceToDevice :从设备复制数据到设备。
举例:

HANDLE_ERROR( cudaMalloc( (void**) &dev_a, N * sizeof(int) ) );
  1. cudaFree
    cudaFree 是 CUDA 中用于释放设备(GPU)上已分配内存的函数。
    使用举例:
HANDLE_ERROR( cudaFree(dev_a ));
  1. cudaGetDeviceCount
    cudaGetDeviceCount 是 CUDA 中用于查询当前主机上可用 GPU 设备数量的函数。
    举例:
int deviceCount;
HANDLE_ERROR( cudaGetDeviceCount(&deviceCount) );
  1. cudaGetDeviceProperties
    cudaGetDeviceProperties 函数是CUDA提供的一种API,用于获取指定设备的属性信息。它的函数原型为
cudaError_t cudaGetDeviceProperties(
struct cudaDeviceProp* prop,
int device
);

其中, prop 是一个指向 cudaDeviceProp 结构体的指针,用于存储设备属性的详细信息。
device 表示要查询的设备的编号。请注意,在调用该函数之前,必须使用 cudaSetDevice 函数将要查询的设备设置为当前设备。
代码示例:

int main()
{
int deviceCount;
HANDLE_ERROR( cudaGetDeviceCount(&deviceCount) );
if (deviceCount == 0) {
printf("There is no available CUDA device.\n");
return 0;
}
int dev = 0;
HANDLE_ERROR( cudaSetDevice(dev) );
cudaDeviceProp prop;
HANDLE_ERROR( cudaGetDeviceProperties(&prop, dev) );
printf("Device Name: %s\n", prop.name);
printf("Total Global Memory: %ld bytes\n", prop.totalGlobalMem);
printf("Number of Multi-Processors: %d\n", prop.multiProcessorCount);
printf("Clock Rate: %d MHz\n", prop.clockRate / 1000);
printf("Max Threads per Block: %d\n", prop.maxThreadsPerBlock);
return 0;
}
  1. cudaMallocHost
    cudaMallocHost 是一种在主机上分配固定内存的 CUDA API 函数。
    使用方法:
int* host_data;
size_t size = 1024 * 1024 * sizeof(int); // 申请 1MB 内存
HANDLE_ERROR( cudaMallocHost(&host_data, size) );
cudaFreeHost(host_data);
  1. cudaFreeHost
    cudaFreeHost 函数用于释放由 cudaMallocHost 函数分配的主机内存空间。

🍎总结

    本文总共总结多个考点,都是很有可能被考到的,同学们可以收藏起来看,下期我们将会继续介绍cuda函数,以及几个可能会考编程题的重要编程题汇总,感谢大家的支持,一起进步!文章来源地址https://www.toymoban.com/news/detail-443552.html

到了这里,关于【C++】CUDA期末复习指南上(详细)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构笔记(c++版,期末复习)

      目录 一、绪论 1.数据结构基本概念 2.算法定义与特征 二、线性表 1.线性表的定义 2.顺序表的存储结构 3.链式存储结构 三、栈和队列 1、栈的基本概念 2.队列的基本概念 3.循环队列  四、字符串和多维数组 1.字符串的基本概念 2.串的简单模式匹配 3.多维数组 3.1数组的定义

    2024年02月12日
    浏览(36)
  • 计算机系统基础期末复习--袁春风详细版

    用“系统思维”分析问题 -21474836482147483647 (false)与事实不符?!why? 以下表达式如何呢? i2147483647 true!why? 在变化一下 -2147483647-12147483647 结果怎么样? 第二个例子 当len=0时调用sum函数时,其返回值是多少? 出现访存异常。但当len为int类型时,则正常。why? 若x和y为int类型,

    2024年02月11日
    浏览(32)
  • 算法设计与分析期末复习题(史上最详细)

    算法设计与分析期末复习题(一) 1、二分搜索算法是利用( A )实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 2、下列不是动态规划算法基本步骤的是( A )。 A、找出最优解的性质 B、构造最优解 C、算出最优解 D、定义最优解 3、最大效益优先是( A )的一

    2023年04月09日
    浏览(37)
  • C++程序设计期末考试复习试题及解析 3(自用~)

    可以很清楚看到浅拷贝所造成的错误:在析构的时候会重复析构,这是由于浅拷贝时,b的buffer指针和a的buffer指针指向的是同一片空间 如何更改? 换为深拷贝! 即弃用默认拷贝构造函数,自己写一个拷贝构造函数 改为深拷贝后,a、b对象不会相互影响,由于b未调用set()函

    2024年02月09日
    浏览(32)
  • 西安石油大学 C++期末考试 重点知识点+题目复习(下)

    析构函数的调用顺序与对象的创建和销毁顺序相反。 对于单个对象,当对象的生命周期结束时(例如离开作用域),会调用其析构函数。因此,析构函数会在对象销毁之前被调用。 对于类的成员对象,它们的析构函数的调用顺序与它们在类中的声明顺序相反。即,在类的析

    2024年02月11日
    浏览(43)
  • 西安石油大学 C++期末考试 重点知识点+题目复习(上)

    当使用 const 修饰变量、函数参数、成员函数以及指针时,以下是一些代码示例: 声明只读变量: 保护函数参数: 防止成员函数修改对象状态: 防止指针修改指向的值: 这些示例展示了如何使用 const 来声明常量、保护函数参数、防止成员函数修改对象状态以及防止指

    2024年02月11日
    浏览(29)
  • C++期末考试选择题题库100道&&C++期末判断题的易错知识点复习

    今天备考C++,看到了一些好的复习资料,整合一起给大家分享一下 对于常数据成员,下面描述正确的是 【 B 】 A. 常数据成员必须被初始化,并且不能被修改 B. 常数据成员可以不初始化,并且不能被修改 C. 常数据成员可以不初始化,并且可以被修改 D. 常数据成员必须被初始

    2024年02月10日
    浏览(37)
  • 计算机网络期末复习简答题、综合题、实验题答案整理汇总详细(持续更新中)

    简答题只背标黄的部分!!综合题和实验题全看!!! 1. TCP/IP 与 OSI 相结合的五层体系结构将计算机网络划分成哪几个层次?各层的主要功能是什么 第一层,物理层:物理层的任务就是透明地传送比特流。(注意:传递信息的物理媒体,如双绞线、同轴电缆、光缆等,是在

    2024年02月08日
    浏览(31)
  • 【期末复习】微信小程序复习大纲

    前言:         这周开始进入期末复习周,没时间看C/C++、linux等知识了,先把期末考试必考的知识捋一遍。 目录 第一章        微信小程序入门 一、填空题 二、判断题 三、选择题 四、简答题 第二章        微信小程序页面制作 一、填空题 二、判断题 三、选择题

    2024年02月04日
    浏览(35)
  • 【期末复习】北京邮电大学《数字内容安全》课程期末复习笔记(2. 信息隐藏与数字水印)

    【相关链接】 【期末复习】北京邮电大学《数字内容安全》课程期末复习笔记(1. 绪论) 【期末复习】北京邮电大学《数字内容安全》课程期末复习笔记(3. 文本安全) 【期末复习】北京邮电大学《数字内容安全》课程期末复习笔记(4. 多媒体安全) 【期末复习】北京邮电

    2024年02月09日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包