并行程序设计复习题库
并行程序设计复习题库,覆盖填空、判断、选择和大题,并附答案、解释与课本 OCR 来源。
并行程序设计复习题库#
题量概览#
- 填空题:98
- 判断题:72
- 选择题:72
- 大题:43
目录#
- 第一章 为什么要并行计算:47 题
- 第二章 并行硬件和软件:47 题
- 第三章 MPI 进行分布式内存编程:47 题
- 第四章 Pthreads 进行共享内存编程:47 题
- 第五章 用 OpenMP 进行共享内存编程:48 题
- 第六章 CUDA 异构编程:49 题
第一章 为什么要并行计算#
填空题#
1-填空-1#
并发强调多个任务在同一________内交替执行,而并行强调多个任务在同一________真正同时运行。
答案: 时间段;时刻
解释: 复习资料用“同一时间段内交替执行”和“同一时刻真正同时运行”区分并发和并行。
来源: 并行复习 p.4
1-填空-2#
分布式程序把任务拆分到多台物理机器上,并通过________通信协调完成共同目标。
答案: 网络
解释: 资料把分布式定义为多台物理机器通过网络通信协调。
来源: 并行复习 p.4
1-填空-3#
任务并行把________任务分配给不同处理单元;数据并行把________操作应用到不同数据子集。
答案: 不同;相同
解释: 资料分别定义任务并行和数据并行。
来源: 并行复习 p.4
1-填空-4#
并行程序中核之间的协调主要包括通信、________和同步。
答案: 负载均衡
解释: 复习资料列出通信、负载均衡、同步三类协调。
来源: 并行复习 p.4;并行复习 p.5
1-填空-5#
课程材料中,分布式内存编程主要对应 ________,共享内存编程主要对应 Pthreads 和 OpenMP。
答案: MPI
解释: 资料在并行系统处写明分布式:MPI;共享:Pthread、OpenMP。
来源: 并行复习 p.5
1-填空-6#
峰值性能常按核心数、每核频率和每周期________操作数相乘估算。
答案: 浮点
解释: 资料列出峰值性能 = 核心数、每核频率、每周期浮点操作数。
来源: 并行复习 p.3
1-填空-7#
继续单纯提高 CPU 频率会让集成电路变热,并最终导致________问题。
答案: 不可靠
解释: 资料指出晶体管传递速度加快会使集成电路变热并最终导致不可靠。
来源: 并行复习 p.3
1-填空-8#
在批改试卷例子中,4 个助教每人改 25 份试卷属于________并行。
答案: 数据
解释: 资料把每人改 25 份试卷作为数据并行例子。
来源: 并行复习 p.4
1-课本填空-1#
书中把并行系统按内存访问方式分为共享内存系统和________内存系统。
答案: 分布式
解释: 课本说明,共享内存系统中各核心原则上可读写每个内存位置;分布式内存系统中每个核心有私有内存,并通过网络发送消息等方式显式通信。
来源: 课本OCR-并行程序设计导论 原书第2版 p.19
1-课本补充-填空-1#
课本小结指出,由于物理限制,传统处理器性能提升速度大幅下降,芯片制造商转向在一个芯片上集成多个传统处理器,即________集成电路。
答案: 多核
解释: 课本第1章小结把处理器性能提升放缓与多核集成电路的出现直接联系起来。
来源: 课本OCR-并行程序设计导论 原书第2版 p.22
1-课本补充-填空-2#
在课本全局求和伪代码中,初始化数组 x 后、各核心计算部分和前,需要加入一个同步点,即 ________。
答案: Synchronize_cores()
解释: 课本说明如果某些核心还在初始化 x,其他核心就开始计算部分和会出错,所以需要在初始化和部分求和之间同步。
来源: 课本OCR-并行程序设计导论 原书第2版 p.19
1-课本补充-填空-3#
树状结构全局求和中,如果核心数是 2 的幂,配对核心可通过当前核心编号与位掩码做按位________得到。
答案: 异或
解释: 课本练习说明,每一阶段通过反转编号中与 bitmask 非零位对应的位得到配对核心编号,可用按位异或实现。
来源: 课本OCR-并行程序设计导论 原书第2版 p.24
1-课本概念-填空-1#
共享内存系统中,各核心通过访问共享________位置来协调行动。
答案: 内存
解释: 课本第1章小结把共享内存系统定义为各核心共享一个大的内存池,并通过访问共享内存位置协调。
来源: 课本OCR-并行程序设计导论 原书第2版 p.23
1-课本概念-填空-2#
分布式内存系统中,每个核心有自己的________内存,核心通过网络发送消息协调。
答案: 私有
解释: 课本第1章小结区分共享内存和分布式内存:分布式内存中每个核心都有自己的私有内存。
来源: 课本OCR-并行程序设计导论 原书第2版 p.23
1-课本概念-填空-3#
MIMD 的中文含义是多________流多数据流。
答案: 指令
解释: 课本把能相互独立运行的核心系统称为多指令流多数据流系统。
来源: 课本OCR-并行程序设计导论 原书第2版 p.23
1-课本概念-填空-4#
SIMD 的中文含义是单指令流多________流。
答案: 数据
解释: 课本把所有核心执行相同指令、处理各自数据流的系统称为单指令流多数据流系统。
来源: 课本OCR-并行程序设计导论 原书第2版 p.23
判断题#
1-判断-1#
单处理器继续单纯提高主频会带来发热和可靠性问题,因此继续依靠晶体管速度提升性能不可行。
答案: 正确
解释: 复习资料指出,晶体管传递速度加快会使集成电路变热并最终导致不可靠,所以需要利用晶体管密度增加来放置多个相对简单的处理器。
来源: 并行复习 p.3
1-判断-2#
所有并发程序都一定是并行程序或分布式程序。
答案: 错误
解释: 资料表述是所有并行和分布式程序都是并发的;并发只要求多个任务在同一时间段内交替执行,不必同一时刻真正同时运行。
来源: 并行复习 p.4
1-判断-3#
数据并行是把相同操作应用到不同数据子集上。
答案: 正确
解释: 资料将数据并行定义为每个处理单元执行相同操作,但处理不同的数据。
来源: 并行复习 p.4
1-判断-4#
任务并行要求每个处理单元执行完全相同的操作,只是数据不同。
答案: 错误
解释: 这是数据并行的描述;任务并行是把不同任务或功能分配给不同处理单元。
来源: 并行复习 p.4
1-判断-5#
并行程序中,多个核独立工作时相对简单,但核之间协调会增加复杂度。
答案: 正确
解释: 资料明确说各核独立工作时并行程序接近串行程序,但核之间通常需要协调,协调包含通信、负载均衡和同步。
来源: 并行复习 p.4;并行复习 p.5
1-判断-6#
课程材料把 MPI 归入分布式内存编程,把 Pthreads 和 OpenMP 归入共享内存编程。
答案: 正确
解释: 复习资料在并行系统处列出:分布式对应 MPI,共享对应 Pthread、OpenMP。
来源: 并行复习 p.5
1-课本判断-1#
在 SIMD 系统中,不可能让一个核心执行加法、另一个核心同时执行乘法。
答案: 正确
解释: 课本用加法和乘法示例说明 SIMD 核心必须执行相同指令;若需要不同指令,只能让一个核心执行时另一个空闲,再交换执行。
来源: 课本OCR-并行程序设计导论 原书第2版 p.20
1-课本补充-判断-1#
课本认为普通串行程序通常不能自动利用多核,翻译程序也不太可能承担所有串行到并行的转换工作。
答案: 正确
解释: 第1章小结明确指出,普通串行程序通常无法利用多核,编译/翻译程序不太可能完成全部转换,因此软件开发者需要学习并行程序。
来源: 课本OCR-并行程序设计导论 原书第2版 p.22
1-课本补充-判断-2#
只要各核心独立工作,编写并行程序通常就和编写串行程序基本相同;复杂性主要在需要协调时出现。
答案: 正确
解释: 课本在全局求和例子后说明,核心独立工作时并行程序接近串行程序;一旦需要协调,事情会变复杂。
来源: 课本OCR-并行程序设计导论 原书第2版 p.18
1-课本概念-判断-1#
并行和分布式之间没有硬性的区别,但并行程序中的任务通常耦合更紧密。
答案: 正确
解释: 课本第1章小结明确指出并行和分布式之间没有硬性区别,并行程序任务通常更紧密耦合。
来源: 课本OCR-并行程序设计导论 原书第2版 p.23
1-课本概念-判断-2#
并发程序在任何时刻都必须有多个任务真正同时执行。
答案: 错误
解释: 课本区分并发、并行和分布式:并发是任意时刻有多个任务在进行,不等同于真正同时执行。
来源: 课本OCR-并行程序设计导论 原书第2版 p.23
1-课本概念-判断-3#
本书使用 C 语言和 MPI、Pthreads、OpenMP、CUDA 四个 API 学习并行系统编程。
答案: 正确
解释: 课本第1章小结列出将使用 C 语言和四个 API:MPI、Pthreads、OpenMP、CUDA。
来源: 课本OCR-并行程序设计导论 原书第2版 p.22
选择题#
1-选择-1#
为什么现代并行系统倾向于多核处理器,而不是继续主要提高单核主频?
A. 因为编译器无法生成串行代码 B. 因为继续加快晶体管速度会带来发热和可靠性问题,而晶体管密度仍可用于放置多个核心 C. 因为内存容量已经无法增加 D. 因为分布式系统不需要通信
答案: B
解释: 资料把单处理器主频提升受限和多核处理器出现联系起来:晶体管速度继续加快不可行,但密度增加可以用于并行。
来源: 并行复习 p.3
1-选择-2#
峰值浮点性能的常见估算式是下面哪一个?
A. 核心数 x 每核频率 x 每周期浮点操作数 B. 内存容量 x 缓存行大小 C. 网络带宽 / 延迟 D. 线程数 + 进程数
答案: A
解释: 复习资料列出的峰值性能计算项为核心数、每核频率、每周期浮点操作数。
来源: 并行复习 p.3;并行复习 p.4
1-选择-3#
下列哪项最符合“并行”的定义?
A. 多个任务在同一时间段内交替执行,看起来同时运行 B. 多个任务在同一时刻真正同时运行,通常依赖多个核心或计算资源 C. 多个任务必须分布在多台物理机器上 D. 只有一个任务在一个核心上执行
答案: B
解释: 资料区分并发、并行、分布式:并行强调同一时刻真正同时运行。
来源: 并行复习 p.4
1-选择-4#
下列哪项最符合“分布式”的定义?
A. 同一进程中的多个线程共享内存 B. 将任务拆分到多台物理机器上,通过网络通信协调完成共同目标 C. 同一条指令作用于多个数据 D. 单核通过流水线提高吞吐量
答案: B
解释: 资料将分布式定义为任务拆分到多台物理机器,并通过网络通信协调。
来源: 并行复习 p.4
1-选择-5#
4 个助教分别批改 25 份试卷,这属于哪种并行方式?
A. 任务并行 B. 数据并行 C. 流水线并行 D. 不属于并行
答案: B
解释: 资料用批改试卷举例:4 个助教每人改 25 份试卷是数据并行;按题型分工才是任务并行。
来源: 并行复习 p.4
1-选择-6#
并行程序中核之间协调主要包括哪些方面?
A. 通信、负载均衡、同步 B. 编译、链接、清理 C. 加密、压缩、解压 D. 绘图、渲染、显示
答案: A
解释: 复习资料直接列出协调过程主要分为通信、负载均衡、同步。
来源: 并行复习 p.4;并行复习 p.5
1-课本选择-1#
课本对 MPI、Pthreads、OpenMP、CUDA 的适用系统描述,哪项正确?
A. MPI 用于分布式内存 MIMD;Pthreads 用于共享内存 MIMD;OpenMP 可用于共享内存 MIMD/SIMD;CUDA 用于 NVIDIA GPU B. MPI 只用于共享内存 SIMD C. Pthreads 只用于 GPU D. CUDA 只用于分布式内存 MIMD 集群
答案: A
解释: 课本明确把 MPI、Pthreads、OpenMP 和 CUDA 分别放到相应的系统类型和编程对象中。
来源: 课本OCR-并行程序设计导论 原书第2版 p.23
1-课本补充-选择-1#
在课本全局求和例子中,第一阶段每个核心计算自己的部分和主要属于哪类并行?
A. 数据并行 B. 任务并行 C. 流水线并行 D. 串行执行
答案: A
解释: 课本练习明确把每个核心累加其分配计算值的第一部分称为数据并行例子。
来源: 课本OCR-并行程序设计导论 原书第2版 p.24
1-课本补充-选择-2#
树状结构全局求和相比“所有核心发送给主核心”的直接方案,主要降低了哪个核心的汇总压力?
A. 核心0/主核心 B. 最后一个核心 C. 所有空闲核心 D. GPU 设备核心
答案: A
解释: 课本说明直接方案让主核心完成最终求和,而树状配对让不同核心分阶段合并结果,减少主核心接收和加法数量。
来源: 课本OCR-并行程序设计导论 原书第2版 p.17;课本OCR-并行程序设计导论 原书第2版 p.24
1-课本概念-选择-1#
下列哪项是分布式内存系统协调核心工作的典型方式?
A. 通过网络发送消息 B. 所有核心隐式读写同一个寄存器 C. 禁用所有通信 D. 只依靠编译器自动向量化
答案: A
解释: 课本说明分布式内存系统中核心通过在网络上发送消息协调行动。
来源: 课本OCR-并行程序设计导论 原书第2版 p.23
1-课本概念-选择-2#
课本把 Pthreads 主要用于哪类系统编程?
A. 共享内存 MIMD 系统 B. 分布式内存 SIMD 系统 C. 只含 GPU 的系统 D. 单核 SISD 系统
答案: A
解释: 课本第1章小结说明 Pthreads 用于为共享内存 MIMD 系统编程。
来源: 课本OCR-并行程序设计导论 原书第2版 p.23
1-课本概念-选择-3#
课本把 MPI 主要用于哪类系统编程?
A. 分布式内存 MIMD 系统 B. 共享内存 SIMD 系统 C. 单线程串行系统 D. 只含统一内存的 GPU
答案: A
解释: 课本第1章小结说明 MPI 用于分布式内存 MIMD 系统的编程。
来源: 课本OCR-并行程序设计导论 原书第2版 p.23
大题#
1-大题-1#
简述为什么需要构建并行系统。要求从单处理器性能提升受限、多核处理器出现、程序员需要利用并行硬件三个角度回答。
答案: 单处理器过去主要依赖晶体管密度增加和速度提升来提高性能,但继续提高速度会带来发热和可靠性问题;与此同时,晶体管密度仍在增加,因此可以在单芯片上放置多个相对简单的处理器,形成多核处理器。硬件已经提供并行资源后,程序必须把计算拆分到多个核心或多台机器上,才能继续获得性能提升。
解释: 答案按资料中的逻辑组织:频率提升受限 -> 利用晶体管密度做多核 -> 需要编写并行程序。
来源: 并行复习 p.3;课程要点-并行程序设计第2版 para 4;课程要点-并行程序设计第2版 para 5
1-大题-2#
比较并发、并行和分布式,并说明三者的包含关系。
答案: 并发强调多个任务在同一时间段内交替执行,看起来像同时运行;并行强调多个任务在同一时刻真正同时运行,依赖多个核心或多个计算资源;分布式强调任务分布在多台物理机器上,并通过网络通信协调完成目标。资料给出的关系是:所有并行和分布式程序都是并发的,但并发不一定并行,也不一定分布式。
解释: 核心区别在于“同一时间段”“同一时刻”和“多台物理机器/网络通信”。
来源: 并行复习 p.4;课程要点-并行程序设计第2版 para 7
1-大题-3#
比较任务并行和数据并行,并用“批改试卷”的例子说明。
答案: 任务并行把不同任务或功能分配给不同处理单元,例如助教 A 批选择题、助教 B 批填空题、助教 C 批问答题。数据并行把相同操作应用到不同数据子集上,例如 4 个助教每人批 25 份试卷。二者都可能需要通信、负载均衡和同步来协调。
解释: 资料直接给出了任务并行、数据并行定义和批改试卷例子。
来源: 并行复习 p.4;并行复习 p.5
1-课本大题-1#
依据课本,说明为什么 GPU 既不是纯 SIMD,也不是纯 MIMD。
答案: GPU 的给定核心上的数据通路可以使用 SIMD 并行,但当代 GPU 可以在单个核心上运行多个指令流;典型 GPU 还有几十个核心,这些核心也能执行独立指令流。因此 GPU 同时具有 SIMD 和 MIMD 的特征,不能简单归为纯 SIMD 或纯 MIMD。
解释: 课本直接强调 GPU 不是纯 SIMD 系统,也不是纯 MIMD 系统,并给出核心内和多核心层面的原因。
来源: 课本OCR-并行程序设计导论 原书第2版 p.37
1-课本补充-大题-1#
根据课本全局求和例子,说明通信、负载均衡和同步分别在哪里出现。
答案: 通信出现在一个或多个核心把当前部分和发送给另一个核心时;负载均衡出现在第一阶段给每个核心分配大致相同数量、且工作量接近的计算值时;同步出现在必须等数组 x 初始化完成后才能开始部分求和,以及树状归约每一阶段必须等待前一阶段结果可用时。
解释: 课本在全局求和例子后逐项说明了通信、负载平衡和同步,并在伪代码处给出 `Synchronize_cores()` 的必要性。
来源: 课本OCR-并行程序设计导论 原书第2版 p.18;课本OCR-并行程序设计导论 原书第2版 p.19
1-课本补充-大题-2#
推导并比较直接全局求和和树状全局求和中核心0的接收/加法次数。假设核心数 p 是 2 的幂。
答案: 直接方案中,其他 p-1 个核心都把部分和发送给核心0,所以核心0需要完成 p-1 次接收和 p-1 次加法。树状结构中每一阶段问题规模减半,核心0只在每一层接收并合并一次,因此需要 log2(p) 次接收和 log2(p) 次加法。
解释: 课本练习要求推导核心0在原始伪代码和树状结构全局和中的接收与加法数量,树状配对过程见课本图示和位掩码说明。
来源: 课本OCR-并行程序设计导论 原书第2版 p.17;课本OCR-并行程序设计导论 原书第2版 p.24
1-课本补充-大题-3#
为什么课本把“良好的程序开发技术”放在并行程序中特别强调?
答案: 并行程序除了普通程序的算法和实现问题,还要处理核心之间通信、负载均衡、同步、任务划分和调试等问题。课本指出并行程序通常非常复杂,因此更需要良好的程序开发技术,以避免把协调问题隐藏在难以定位的错误中。
解释: 第1章小结和练习前说明并行程序通常复杂,且编写时需要协调通信、负载平衡和同步。
来源: 课本OCR-并行程序设计导论 原书第2版 p.22;课本OCR-并行程序设计导论 原书第2版 p.23
第二章 并行硬件和软件#
填空题#
2-填空-1#
冯诺依曼架构困境指处理器速度和________访问速度之间差距越来越大。
答案: 内存
解释: 资料说明 CPU 和主存分离导致 CPU 大量时间等待数据。
来源: 并行复习 p.5
2-填空-2#
Cache 利用两类局部性:时间局部性和________局部性。
答案: 空间
解释: 资料说明程序员不能显式控制 Cache Line,需要利用时间局部性和空间局部性。
来源: 并行复习 p.6
2-填空-3#
写回策略会先把被修改的 Cache Line 标记为________,等换出 Cache 后再写回主存。
答案: 脏的
解释: 复习资料对写回的定义是标记 Cache Line 为脏,换出时再写主存。
来源: 并行复习 p.6
2-填空-4#
Flynn 分类法按照同时管理的________流数目和数据流数目分类。
答案: 指令
解释: 资料说明 Flynn 分类法按指令流和数据流数目分类。
来源: 并行复习 p.7
2-填空-5#
SIMD 可以抽象为一个控制单元和多个________。
答案: ALU
解释: 资料说明 SIMD 有一个控制单元和多个 ALU。
来源: 并行复习 p.8
2-填空-6#
MIMD 系统的两类主要形式是共享内存系统和________内存系统。
答案: 分布式
解释: 复习资料说明 MIMD 系统主要类型为共享内存和分布式内存。
来源: 并行复习 p.8
2-填空-7#
效率 E 的常用公式是 E = S / ________。
答案: p
解释: 资料说明效率表示 S 接近线性加速比的程度,所以除以 p。
来源: 并行复习 p.16
2-填空-8#
固定问题规模、增加核数并希望效率维持不变,称为________扩展性。
答案: 强
解释: 资料定义强扩展性为固定问题规模,增加核数 P,效率维持不变。
来源: 并行复习 p.19
2-课本填空-1#
SPMD 程序不是在每个核心上运行不同程序,而是由同一个可执行程序在不同进程/线程上运行,通常依靠________区分各自工作。
答案: 编号或秩
解释: 课本在并行软件部分说明主要关注 SPMD:同一程序在多个进程/线程上运行,再由各自身份决定执行哪部分任务。
来源: 课本OCR-并行程序设计导论 原书第2版 p.46
2-课本补充-填空-1#
课本小结中,CPU 和内存分离限制指令执行速度的问题称为________瓶颈。
答案: 冯·诺依曼
解释: 课本第2章小结说明,CPU 和内存分离被称为冯·诺依曼瓶颈,因为它限制了指令执行速度。
来源: 课本OCR-并行程序设计导论 原书第2版 p.67
2-课本补充-填空-2#
虚拟地址和物理地址的对应关系存储在主存中的页表;为减少页表访问,CPU 使用页表缓存,即________。
答案: 转换查找缓冲区(TLB)
解释: 课本说明页表在主存中,直接查页表可能导致额外内存访问,因此 CPU 有转换查找缓冲区存储最近使用的页表条目。
来源: 课本OCR-并行程序设计导论 原书第2版 p.68
2-课本补充-填空-3#
课本把由处理器和编译器控制、程序员通常不直接控制的低层次并行分为指令级并行和________级并行。
答案: 线程
解释: 课本将 ILP 和 TLP 作为低层次并行讨论,并指出它们通常由处理器和编译器控制,而不是程序员直接控制。
来源: 课本OCR-并行程序设计导论 原书第2版 p.68
2-课本概念-填空-1#
操作系统通过在执行程序之间快速切换,即使没有多个核心,也能产生多个作业同时运行的________。
答案: 假象
解释: 课本第2章小结说明,多任务操作系统通过快速切换产生多个作业同时运行的假象。
来源: 课本OCR-并行程序设计导论 原书第2版 p.67
2-课本概念-填空-2#
指令级并行的两种主要类型是流水线和________。
答案: 多发射
解释: 课本第2章小结列出 ILP 两种主要类型:流水线和多发射。
来源: 课本OCR-并行程序设计导论 原书第2版 p.68
2-课本概念-填空-3#
Flynn 分类法区分系统可同时管理的________流数量和数据流数量。
答案: 指令
解释: 课本说明 Flynn 分类法区分系统可以同时管理的指令流数量和数据流数量。
来源: 课本OCR-并行程序设计导论 原书第2版 p.68
2-课本概念-填空-4#
如果所有处理器具有相同体系结构,该系统称为________系统。
答案: 同构
解释: 课本说明所有处理器具有相同体系结构的系统是同构系统;处理器功能不同则是异构系统。
来源: 课本OCR-并行程序设计导论 原书第2版 p.69
判断题#
2-判断-1#
冯诺依曼架构困境是指处理器速度和内存访问速度差距增大,CPU 大量时间等待数据。
答案: 正确
解释: 复习资料把 CPU 和主存分离、CPU 等待数据作为冯诺依曼架构困境。
来源: 并行复习 p.5
2-判断-2#
Cache 通常一次只从内存读取一个标量数据,程序员可以显式控制每个 Cache Line 进入 Cache。
答案: 错误
解释: 资料说明通常一次读取一个 Cache Line,且程序员不能显式控制 Cache Line 放入 Cache,需要利用时间局部性和空间局部性。
来源: 并行复习 p.6
2-判断-3#
空间局部性是指访问某个内存位置后,接下来很可能访问附近位置。
答案: 正确
解释: 复习资料直接给出空间局部性的定义。
来源: 并行复习 p.6
2-判断-4#
SIMD 系统可以抽象为一个控制单元和多个 ALU,同一条指令广播给多个 ALU。
答案: 正确
解释: 资料对 SIMD 的说明正是一个控制单元和多个 ALU,控制单元广播同一条指令。
来源: 并行复习 p.8
2-判断-5#
MIMD 系统与 SIMD 系统一样要求所有处理单元同步执行同一条指令。
答案: 错误
解释: 资料说明 MIMD 支持多个指令流在多个数据流上操作,通常是异步的;同步同指令是 SIMD 的特点。
来源: 并行复习 p.8
2-判断-6#
伪共享发生在多个核心访问同一个 Cache Line 中的不同变量时,可能造成性能急剧下降。
答案: 正确
解释: 资料把伪共享定义为多个核心访问同一 Cache Line 中不同变量而触发无意义一致性开销。
来源: 并行复习 p.13
2-课本判断-1#
伪共享不会导致错误结果,但会因为多余主存访问而破坏程序性能。
答案: 正确
解释: 课本在伪共享小节明确指出,伪共享不会导致不正确的结果,但会使对主存的访问超出必要次数,从而破坏性能。
来源: 课本OCR-并行程序设计导论 原书第2版 p.45
2-课本补充-判断-1#
如果程序员能够看到硬件并行性并修改源代码利用它,课本就把这种硬件视为并行硬件。
答案: 正确
解释: 课本在并行硬件小结中给出这个操作性定义:程序员可见并可通过源代码利用的并行性。
来源: 课本OCR-并行程序设计导论 原书第2版 p.68
2-课本补充-判断-2#
在课本假设中,同构 MIMD 程序计时通常应使用 CPU 时间,而不是挂钟时间。
答案: 错误
解释: 课本说明应使用挂钟时间,因为程序可能在等待消息等状态下仍是活动的,即使核心空闲;CPU 时间不能反映这种等待。
来源: 课本OCR-并行程序设计导论 原书第2版 p.71
2-课本概念-判断-1#
线程由进程启动,通常比进程需要更少的相关数据和信息。
答案: 正确
解释: 课本第2章小结说明,进程有许多相关数据和信息,线程由进程启动,不需要那么多相关数据和信息。
来源: 课本OCR-并行程序设计导论 原书第2版 p.67
2-课本概念-判断-2#
缓存一致性的单位通常是单个变量,因此不会出现伪共享。
答案: 错误
解释: 课本说明缓存一致性的单位是缓存行,不是单个变量,这正是伪共享产生的原因。
来源: 课本OCR-并行程序设计导论 原书第2版 p.69
2-课本概念-判断-3#
异构 CPU-GPU 系统中,本书通常在 CPU 上启动程序,再由 CPU 把计算工作分配给 GPU。
答案: 正确
解释: 课本第2章假设部分说明,在异构 CPU-GPU 系统上,将在 CPU 上启动程序,CPU 将在 GPU 上启动计算。
来源: 课本OCR-并行程序设计导论 原书第2版 p.71
选择题#
2-选择-1#
资料中列出的缓解冯诺依曼架构困境的三类改进措施是?
A. Cache、虚拟内存、低层次并行 B. MPI、Pthreads、OpenMP C. 写直达、写回、写合并 D. 主机、设备、网格
答案: A
解释: 复习资料明确列出 Cache、虚拟内存和低层次并行。
来源: 并行复习 p.5
2-选择-2#
下列关于写直达和写回的说法哪项正确?
A. 写直达修改 Cache 后立刻写回主存;写回先把 Cache Line 标为脏,换出时再写主存 B. 写回每次修改后立刻写主存 C. 写直达只适用于寄存器 D. 二者都与主存一致性无关
答案: A
解释: 复习资料分别定义了写直达和写回。
来源: 并行复习 p.6
2-选择-3#
Flynn 分类法主要根据什么划分体系结构?
A. 同时管理的指令流数目和数据流数目 B. 处理器品牌和主频 C. 是否支持 C 语言 D. Cache Line 大小
答案: A
解释: 资料说明 Flynn 分类法按能够同时管理的指令流数目和数据流数目分类。
来源: 并行复习 p.7
2-选择-4#
下列哪项是共享内存系统的典型特点?
A. 多个处理单元共享同一块主内存空间,可以直接访问和通信 B. 每个处理单元只能通过显式消息访问别人的内存 C. 只能运行 MPI D. 没有 Cache 一致性问题
答案: A
解释: 资料将共享内存系统定义为多个处理单元共享同一块主内存空间。
来源: 并行复习 p.8
2-选择-5#
若程序有 10% 串行部分,根据资料对阿姆达尔定律的说明,理论最高加速比约为多少?
A. 2 B. 4 C. 10 D. 与核心数无限线性增长
答案: C
解释: 资料给出串行部分为 10% 时,最高加速比只有 10。
来源: 并行复习 p.18
2-选择-6#
强扩展性与弱扩展性的关键区别是?
A. 强扩展固定问题规模,弱扩展随核数增加而按比例增加问题规模 B. 强扩展只用于 GPU,弱扩展只用于 CPU C. 强扩展不考虑效率,弱扩展不考虑核数 D. 强扩展必须用 MPI,弱扩展必须用 OpenMP
答案: A
解释: 资料定义强扩展性为固定问题规模增加核数,弱扩展性为核数增加时问题规模也相同规模增加以维持效率。
来源: 并行复习 p.19
2-课本选择-1#
课本列出的 Foster 并行程序设计方法四步,正确顺序是?
A. 划分、通信、凝聚或聚合、映射 B. 映射、划分、通信、凝聚 C. 通信、映射、划分、凝聚 D. 凝聚、映射、通信、划分
答案: A
解释: 课本引用 Foster 方法论,依次为划分、通信、凝聚或聚合、映射。
来源: 课本OCR-并行程序设计导论 原书第2版 p.62
2-课本补充-选择-1#
课本说评估互连网络常看的两个整体指标是什么?
A. 等分宽度或等分带宽 B. 源代码行数和编译时间 C. 寄存器个数和页大小 D. 线程名和进程号
答案: A
解释: 课本小结中说通常通过等分宽度或等分带宽评估网络能支持多少同步通信。
来源: 课本OCR-并行程序设计导论 原书第2版 p.69
2-课本补充-选择-2#
下列哪项最符合课本对分布式内存消息传递的描述?
A. 至少包含发送函数和接收函数;send 可能阻塞或缓存,receive 通常阻塞直到收到消息 B. 所有进程直接读写同一变量,不需要通信 C. 只能通过共享全局数组通信 D. 接收函数通常在消息到达前立即返回
答案: A
解释: 课本在消息传递小结中描述 send/receive 的常见行为:send 可能阻塞或复制到内部存储,receive 最常见行为是阻塞。
来源: 课本OCR-并行程序设计导论 原书第2版 p.70
2-课本概念-选择-1#
下列哪项属于线程级并行而不是指令级并行?
A. 硬件多线程 B. 流水线 C. 多发射 D. 单条指令译码
答案: A
解释: 课本将硬件多线程与 TLP 联系起来,而流水线和多发射属于 ILP。
来源: 课本OCR-并行程序设计导论 原书第2版 p.68
2-课本概念-选择-2#
课本对线性加速比的理想描述是?
A. p 个进程/线程时并行程序运行速度是串行程序的 p 倍 B. p 个进程时运行时间增加 p 倍 C. 效率一定为 0 D. 只要加线程就无限快
答案: A
解释: 课本性能小结说明,p 个进程/线程且每核心不超过一个时,理想是并行程序速度为串行程序的 p 倍,称为线性加速比。
来源: 课本OCR-并行程序设计导论 原书第2版 p.70
2-课本概念-选择-3#
强可扩展性的定义更接近哪项?
A. 问题规模不变,增加进程/线程数仍能保持效率 B. 问题规模必须按线程数同比增加 C. 只适用于单核程序 D. 只看编译时间是否降低
答案: A
解释: 课本区分强/弱可扩展性:问题规模保持不变可保持效率称为强可扩展性。
来源: 课本OCR-并行程序设计导论 原书第2版 p.71
大题#
2-大题-1#
结合 `sum += z[i]` 这类数组求和循环,解释时间局部性和空间局部性。
答案: 时间局部性体现在 `sum` 被反复读取和更新,CPU 可以把它保留在寄存器或 Cache 中,避免每次从主存加载。空间局部性体现在数组 `z` 连续存储,访问 `z[0]` 时可能把包含后续元素的 Cache Line 一起读入,之后访问 `z[1]`、`z[2]` 等更容易命中 Cache。
解释: 答案直接来自资料对 `float z[1000]` 求和示例的解释。
来源: 并行复习 p.6
2-大题-2#
比较 SIMD 和 MIMD,并说明它们适合的并行模式或系统类型。
答案: SIMD 用一个控制单元向多个 ALU 广播同一条指令,让不同 ALU 处理不同数据,适合规则的数据并行,但复杂分支会降低效率。MIMD 支持多个独立处理单元在多个数据流上运行不同指令,通常异步,是目前使用较多的形式,可进一步分为共享内存系统和分布式内存系统。
解释: 资料在 SIMD/MIMD 小节分别说明了控制单元、ALU、同步/异步、共享内存和分布式内存。
来源: 并行复习 p.8;课程要点-计算机体系结构-量化研究方法-第六版-第四章 para 4;课程要点-计算机体系结构-量化研究方法-第六版-第四章 para 5
2-大题-3#
解释加速比、效率、阿姆达尔定律和可扩展性之间的关系。
答案: 加速比衡量并行程序相对串行程序的变快程度,线性加速比是 S=P。效率 E=S/P,表示实际加速比接近线性加速比的程度。阿姆达尔定律说明只要存在串行部分,加速比就有上限。可扩展性描述增加处理器数量时性能能否持续提升;强扩展固定问题规模,弱扩展在增加核数时也增加问题规模。
解释: 资料在性能评估页依次解释了加速比、效率、阿姆达尔定律和强/弱扩展性。
来源: 并行复习 p.16;并行复习 p.17;并行复习 p.18;并行复习 p.19
2-课本大题-1#
用课本直方图例子解释为什么直接共享 `bin_counts[b]++` 会出现竞争条件,以及一种避免思路。
答案: 如果两个进程或线程被分配到属于同一个桶 b 的数据元素,它们都会执行 `bin_counts[b]++`。若 `bin_counts` 是共享数组,这两个更新可能交错执行,导致丢失更新,形成竞争条件。避免思路是把 `bin_counts` 划分为各进程/线程的局部计数,例如使用 `loc_bin_counts`,最后再合并局部结果。
解释: 课本在 Foster 方法论的直方图示例中指出,共享 `bin_counts[b]++` 会导致竞争条件,而按进程/线程划分 `loc_bin_counts` 可规避共享更新。
来源: 课本OCR-并行程序设计导论 原书第2版 p.64
2-课本补充-大题-1#
解释为什么按行遍历二维数组通常比按列遍历更符合缓存局部性。
答案: C 语言二维数组按行连续存储。按行遍历时,读入一个缓存行后会连续使用同一行中相邻元素,空间局部性好;按列遍历时,相邻访问跨越较大地址间隔,已载入的同一缓存行很快被逐出,缓存未命中更多。课本示例中第一对嵌套循环显著快于第二对。
解释: 课本用 MAX=1000 的二维数组循环示例说明,两种嵌套循环因缓存未命中次数不同而有明显性能差异。
来源: 课本OCR-并行程序设计导论 原书第2版 p.31
2-课本补充-大题-2#
说明课本中 MIMD 系统、混合系统、异构系统和同构系统的关系。
答案: MIMD 系统执行多个独立指令流,每个指令流可有自己的数据流。较大的 MIMD 系统常是混合系统,即多个较小共享内存节点通过互连网络连接。若处理器功能不同,如 CPU 与 GPU 组合,就是异构系统;若所有处理器具有相同体系结构,就是同构系统。
解释: 课本第2章小结在 MIMD 系统段落中依次定义了这些系统类型。
来源: 课本OCR-并行程序设计导论 原书第2版 p.69
2-课本补充-大题-3#
按课本说明,如何较可靠地测量并行程序运行时间?
答案: 应在源代码中调用计时器,记录挂钟时间;在同构 MIMD 系统中,通常先同步进程/线程再启动计时器,停止计时后取所有进程/线程中的最大运行时间;由于系统可变性,应对同一数据集多次运行,通常取最短时间;为减少可变性,通常每个核心不超过一个进程或线程。
解释: 课本性能小结明确说明计时要用挂钟时间、并行时间要考虑同步和最大运行时间,并建议多次运行取较稳定结果。
来源: 课本OCR-并行程序设计导论 原书第2版 p.71
第三章 MPI 进行分布式内存编程#
填空题#
3-填空-1#
MPI 程序通常用 ________ 编译,用 mpiexec 执行。
答案: mpicc
解释: 复习资料给出 `mpicc -o hello hello.c` 和 `mpiexec -n 4 ./hello`。
来源: 并行复习 p.19
3-填空-2#
MPI_Init 必须在所有其他 MPI 函数调用________执行。
答案: 之前
解释: 资料说明 MPI_Init 必须在所有其他 MPI 函数调用之前执行。
来源: 并行复习 p.20
3-填空-3#
MPI_Comm_rank 用于获取当前进程在通信子中的________。
答案: rank
解释: 资料给出 MPI_Comm_rank 的作用和示例。
来源: 并行复习 p.21
3-填空-4#
MPI_Send 的 count 参数表示发送的数据项个数,而不是________数。
答案: 字节
解释: 资料参数表明确 count 是数据项个数,不是字节数。
来源: 并行复习 p.21
3-填空-5#
MPI_Recv 可用通配符 MPI_ANY_SOURCE 匹配任意________。
答案: 消息来源进程
解释: 资料说明 source 可用 MPI_ANY_SOURCE 匹配任意来源。
来源: 并行复习 p.22
3-填空-6#
MPI 点对点消息匹配主要看 source、tag 和________。
答案: comm
解释: 资料列出 MPI_Recv 与 MPI_Send 匹配需要 source、tag、comm。
来源: 并行复习 p.22
3-填空-7#
MPI_Reduce 将多个进程的数据按指定归约操作聚合,并把结果返回到指定________进程。
答案: 根
解释: 资料说明 MPI_Reduce 将结果返回到指定根进程。
来源: 并行复习 p.25
3-填空-8#
MPI_Allgather 可以理解为 MPI_Gather 加上 ________。
答案: MPI_Bcast
解释: 资料直接写出 `MPI_Allgather = MPI_Gather + MPI_Bcast`。
来源: 并行复习 p.30
3-课本填空-1#
MPI_Init 的目的之一是定义包含启动时所有进程的通信域,称为________。
答案: MPI_COMM_WORLD
解释: 课本说明 MPI_Init 会进行必要设置,其中一个目的就是定义包含用户启动程序所有进程的通信域 MPI_COMM_WORLD。
来源: 课本OCR-并行程序设计导论 原书第2版 p.78
3-课本补充-填空-1#
从程序员视角看,分布式内存系统由通过网络连接的核心-________对组成,相关存储器只有该核心可直接访问。
答案: 存储
解释: 课本第3章开头把分布式内存系统描述为通过网络连接的核心-存储对。
来源: 课本OCR-并行程序设计导论 原书第2版 p.75
3-课本补充-填空-2#
MPI 点对点消息通常包含数据和“信封”信息,信封中包括目的进程、发送进程、标签、通信域和________信息。
答案: 消息大小
解释: 课本解释 MPI 发送进程会组装消息,给数据加上信封信息,其中包含目的、源、标签、通信域和消息大小。
来源: 课本OCR-并行程序设计导论 原书第2版 p.83
3-课本补充-填空-3#
MPI_Bcast 是把单个源进程的数据发送到通信域中的________进程。
答案: 所有
解释: 课本在广播小节说明,source_proc 进程把 data_p 引用的内容发送给通信器中的所有进程。
来源: 课本OCR-并行程序设计导论 原书第2版 p.94
3-课本概念-填空-1#
MPI 是一个可以从 C 或 Fortran 程序中调用的________库。
答案: 函数
解释: 课本第3章小结第一句说明 MPI 是一个函数库。
来源: 课本OCR-并行程序设计导论 原书第2版 p.116
3-课本概念-填空-2#
许多系统使用 ________ 编译 MPI 程序,使用 mpiexec 运行 MPI 程序。
答案: mpicc
解释: 课本第3章小结说明许多系统使用 mpicc 编译、mpiexec 运行 MPI 程序。
来源: 课本OCR-并行程序设计导论 原书第2版 p.116
3-课本概念-填空-3#
C MPI 程序应包含 ________ 头文件以获得 MPI 函数原型、类型和宏。
答案: mpi.h
解释: 课本第3章小结说明 C MPI 程序应该包含 mpi.h 头文件。
来源: 课本OCR-并行程序设计导论 原书第2版 p.116
3-课本概念-填空-4#
MPI_Comm_rank 获取进程在通信域中的________。
答案: 序列号或 rank
解释: 课本在通信域、MPI_Comm_size 和 MPI_Comm_rank 小节说明该函数获取当前进程编号。
来源: 课本OCR-并行程序设计导论 原书第2版 p.78
判断题#
3-判断-1#
MPI 面向分布式内存,主要角色是进程,并且本质上是一个函数库。
答案: 正确
解释: 资料在第三章开头说明 MPI 是分布式内存的,角色主要是进程,实际上是一个函数库。
来源: 并行复习 p.19
3-判断-2#
MPI_Init 可以在任意 MPI 通信函数之后调用。
答案: 错误
解释: 资料说明 MPI_Init 必须在所有其他 MPI 函数调用之前执行。
来源: 并行复习 p.20
3-判断-3#
MPI_Recv 的 count 参数表示最多接收的数据项数量,而不是字节数。
答案: 正确
解释: MPI_Recv 参数表中 count 被解释为最多接收的数据项数量,不是字节数。
来源: 并行复习 p.22
3-判断-4#
MPI_ANY_SOURCE 和 MPI_ANY_TAG 可以在发送方和接收方都使用。
答案: 错误
解释: 资料明确指出这两个通配符只能在接收方使用。
来源: 并行复习 p.22
3-判断-5#
MPI_Send 一定永远阻塞,和消息大小无关。
答案: 错误
解释: 资料说明 MPI_Send 是否阻塞取决于消息大小是否超过阈值,小消息可能进入内部缓冲区并立即返回。
来源: 并行复习 p.23
3-判断-6#
MPI 集合通信按 tag 匹配,点对点通信只按调用顺序匹配。
答案: 错误
解释: 资料说明点对点通信通过 tag 和通信子匹配,集合通信只通过通信子和调用顺序匹配。
来源: 并行复习 p.26
3-课本判断-1#
根据课本经验,在调用 MPI_Init 之前不应该调用其他 MPI 函数。
答案: 正确
解释: 课本在 MPI_Init 和 MPI_Finalize 小节说明,按经验在 MPI_Init 之前不应该调用其他 MPI 函数。
来源: 课本OCR-并行程序设计导论 原书第2版 p.77
3-课本补充-判断-1#
大多数 MPI 程序采用 SPMD 方式:只编译一个程序,再根据进程序列号分支执行不同操作。
答案: 正确
解释: 课本在 SPMD 小节说明,只编译单一程序,进程0和其他进程可根据 rank 执行不同代码,这是 MPI 程序常见方式。
来源: 课本OCR-并行程序设计导论 原书第2版 p.79
3-课本补充-判断-2#
MPI_Reduce 这类集合通信存在的价值之一,是把全局和等通信优化负担交给 MPI 实现而不是每个应用程序员。
答案: 正确
解释: 课本说明全局和有很多可能树结构,期望每个 MPI 程序都写最优函数不合理,因此 MPI_Reduce 把优化负担放到 MPI 实现开发者身上。
来源: 课本OCR-并行程序设计导论 原书第2版 p.90
3-课本概念-判断-1#
MPI_Finalize 应在程序完成 MPI 使用后调用,用于清理 MPI 运行环境。
答案: 正确
解释: 课本在 MPI_Init/MPI_Finalize 小节说明 MPI_Init 做设置,MPI_Finalize 用于结束 MPI。
来源: 课本OCR-并行程序设计导论 原书第2版 p.77;课本OCR-并行程序设计导论 原书第2版 p.116
3-课本概念-判断-2#
MPI 程序中,进程0和其他进程必须编译成不同的可执行文件。
答案: 错误
解释: 课本 SPMD 小节强调只编译单一程序,进程0和其他进程根据 rank 执行不同分支。
来源: 课本OCR-并行程序设计导论 原书第2版 p.79
3-课本概念-判断-3#
MPI_Send 和 MPI_Recv 通常称为点对点通信。
答案: 正确
解释: 课本第3章小结区分点对点通信和集合通信,MPI_Send/MPI_Recv 属于点对点通信。
来源: 课本OCR-并行程序设计导论 原书第2版 p.117
选择题#
3-选择-1#
编译 MPI 程序的典型命令是哪一个?
A. gcc -pthread hello.c -o hello B. mpicc -o hello hello.c C. nvcc hello.cu -o hello D. clang -fopenmp hello.c -o hello
答案: B
解释: 复习资料给出 MPI 编译示例 `mpicc -o hello hello.c`。
来源: 并行复习 p.19
3-选择-2#
MPI_Comm_size 的作用是?
A. 获取通信子中的进程总数 B. 获取当前进程编号 C. 发送一条消息 D. 销毁通信子
答案: A
解释: 资料定义 MPI_Comm_size 为获取通信子中总共有多少个进程。
来源: 并行复习 p.21
3-选择-3#
MPI_Send 中的 count 参数表示什么?
A. 要发送的数据项个数 B. 要发送的字节数 C. 目标进程编号 D. 消息标签
答案: A
解释: MPI_Send 参数表中 count 是要发送的数据项个数,不是字节数。
来源: 并行复习 p.21
3-选择-4#
MPI_Recv 与 MPI_Send 成功匹配至少需要哪些字段一致?
A. source、tag、comm,并且类型和缓冲区容量满足要求 B. 只需要 count 相等 C. 只需要两个进程在同一机器上 D. 只需要 root 相同
答案: A
解释: 资料列出 source、recv_tag/send_tag、recv_comm/send_comm,并补充类型和缓冲区容量条件。
来源: 并行复习 p.22
3-选择-5#
MPI_Reduce 和 MPI_Allreduce 的主要区别是?
A. MPI_Reduce 只有根进程获得结果;MPI_Allreduce 让所有进程获得结果 B. MPI_Allreduce 只能求最大值 C. MPI_Reduce 不属于集合通信 D. 二者参数完全一样
答案: A
解释: 资料说明 MPI_Reduce 的结果返回到指定根进程,MPI_Allreduce 是希望所有进程都获得归约结果。
来源: 并行复习 p.25;并行复习 p.26
3-选择-6#
关于 MPI_Scatter 和 MPI_Gather,下列说法正确的是?
A. Scatter 从根进程分发数据,Gather 把各进程数据聚集到根进程 B. Scatter 和 Gather 都只用于计时 C. Gather 只能在每个进程上产生全局结果 D. Scatter 不属于集合通信
答案: A
解释: 复习资料把 MPI_Scatter 解释为把 root 中数据分给不同进程,把 MPI_Gather 解释为把所有进程数据聚集到根进程。
来源: 并行复习 p.28;并行复习 p.29
3-课本选择-1#
MPI_Reduce 与 MPI_Allreduce 的区别,哪项符合课本小结?
A. MPI_Reduce 把全局操作结果存储在单个指定进程上;MPI_Allreduce 把结果存储在通信域中所有进程上 B. MPI_Reduce 只能广播,MPI_Allreduce 只能发送点对点消息 C. MPI_Allreduce 不属于集合通信 D. 二者都要求只有 0 号进程调用
答案: A
解释: 课本小结指出,MPI_Reduce 的结果在单个指定进程上,MPI_Allreduce 的结果在所有进程上。
来源: 课本OCR-并行程序设计导论 原书第2版 p.117
3-课本补充-选择-1#
在课本对 MPI_Send 语义的说明中,发送进程缓存消息时会发生什么?
A. MPI 系统把消息数据和信封存到内部存储中,MPI_Send 可以返回 B. 接收方必须已经打印消息 C. 发送进程一定永久阻塞 D. 消息标签会被忽略
答案: A
解释: 课本说明发送进程可能缓存消息,MPI 系统把数据和信封存到内部存储中,调用即可返回。
来源: 课本OCR-并行程序设计导论 原书第2版 p.83
3-课本补充-选择-2#
课本为什么说 MPI_Allgather 可能比手写 Gather+Bcast 更合适?
A. MPI 可以使用更合适的通信模式,例如避免简单串接两个树形通信 B. Allgather 不需要任何通信 C. Allgather 只能由 0 号进程调用 D. Gather+Bcast 不是 MPI 函数
答案: A
解释: 课本在矩阵-向量乘法例子中说 Gather 后再 Bcast 可能涉及两种树形通信,MPI 提供独立的 Allgather,可能用更好的模式。
来源: 课本OCR-并行程序设计导论 原书第2版 p.100
3-课本概念-选择-1#
MPI_Comm_size 的作用是?
A. 获取通信域中的进程数 B. 获取本机 CPU 主频 C. 同步所有 GPU 线程 D. 销毁通信域
答案: A
解释: 课本通信域小节给出 MPI_Comm_size 用于获取通信域中的进程数量。
来源: 课本OCR-并行程序设计导论 原书第2版 p.78
3-课本概念-选择-2#
MPI_Bcast 属于哪类通信?
A. 集合通信 B. 单机文件 I/O C. 线程互斥 D. CUDA 核函数调用
答案: A
解释: 课本把广播列为集合通信函数。
来源: 课本OCR-并行程序设计导论 原书第2版 p.94;课本OCR-并行程序设计导论 原书第2版 p.117
3-课本概念-选择-3#
MPI 中参数混叠指什么?
A. 把同一个实际参数传给输入缓冲区和输出缓冲区等本不应重叠的参数 B. 多个进程有相同 rank C. 消息标签为负数 D. 通信域为空
答案: A
解释: 课本第3章小结指出,在 MPI_Reduce 等函数中将相同实际参数传给输入和输出缓冲区称为参数混叠,MPI 明确禁止输出参数与另一个参数混叠。
来源: 课本OCR-并行程序设计导论 原书第2版 p.117
大题#
3-大题-1#
解释 MPI_Send 和 MPI_Recv 的阻塞语义,并说明大消息双向先 Send 后 Recv 为什么可能死锁。
答案: MPI_Recv 一定阻塞,如果消息未到达会等待。MPI_Send 对小消息可能复制到内部缓冲区后返回;对较大消息,如果接收端尚未发起匹配的 MPI_Recv,发送端可能阻塞。若两个进程都先执行大消息 MPI_Send,再执行 MPI_Recv,两个进程都会等待对方先接收,无法到达接收阶段,形成死锁。可以使用 MPI_Sendrecv 或调整收发顺序避免。
解释: 答案结合复习资料对 Send/Recv 语义的描述和参考资料 2 对大消息死锁原因及 Sendrecv 替代方案的说明。
来源: 并行复习 p.23;参考资料2 para 16;参考资料2 para 17;参考资料2 para 41;参考资料2 para 42
3-大题-2#
用 MPI 并行梯形积分时,如何划分计算并汇总结果?说明会用到哪些 MPI 函数。
答案: 基本思路是把积分区间划分为若干梯形,每个进程计算自己负责的一部分局部面积,再用 MPI_Reduce 按求和操作把局部结果汇总到 0 号进程,最后由 0 号进程输出总积分值。程序需要 MPI_Init/MPI_Finalize 管理环境,MPI_Comm_rank 获取当前进程编号,MPI_Comm_size 获取进程数,MPI_Reduce 汇总局部积分结果,MPI_Wtime 可用于计时。
解释: 复习资料给出梯形积分公式和 MPI_Reduce 用法;参考资料 2 也列出梯形法中通过 MPI_Reduce 汇总到进程 0。
来源: 并行复习 p.23;并行复习 p.25;并行复习 p.31;参考资料2 para 90;参考资料2 para 92
3-大题-3#
比较 MPI 点对点通信和集合通信,说明匹配规则和调用要求。
答案: 点对点通信如 MPI_Send/MPI_Recv 发生在发送方和接收方之间,通过 source、tag、comm 等字段匹配,接收方还可使用 MPI_ANY_SOURCE 和 MPI_ANY_TAG。集合通信涉及通信子中的所有进程,所有进程必须调用相同的集合函数,参数需一致,匹配主要依赖通信子和调用顺序,不能用 MPI_Reduce 与 MPI_Recv 相匹配。
解释: 资料在消息匹配和集合通信与点对点通信部分直接给出这些规则。
来源: 并行复习 p.22;并行复习 p.25;并行复习 p.26
3-课本大题-1#
结合课本,说明 MPI_Scatter、MPI_Gather 与 MPI_Allgather 的用途和限制。
答案: MPI_Scatter 可由根进程把数组块分发给各进程;MPI_Gather 可把各进程的局部数组收集到根进程;MPI_Allgather 可理解为先 Gather 再 Bcast,让所有进程获得收集后的向量。课本提醒 Scatter/Gather 示例对块分布且每个块大小相同的向量工作正常,因此使用时要注意数据分布和每进程块大小限制。
解释: 课本给出了 Scatter、Gather 和 Allgather 的函数语义,并指出 Gather/Scatter 示例对相同大小块分布有使用限制。
来源: 课本OCR-并行程序设计导论 原书第2版 p.96;课本OCR-并行程序设计导论 原书第2版 p.98;课本OCR-并行程序设计导论 原书第2版 p.100
3-课本补充-大题-1#
用课本梯形法则例子说明 Foster 方法论在 MPI 并行化中的应用。
答案: 先划分任务:计算单个梯形面积和计算面积总和;再识别通信:局部面积需要汇总到总和;然后凝聚:把多个相邻梯形分配给同一进程形成较大的局部任务;最后映射:把局部梯形块映射到各进程,每个进程计算局部积分,再通过归约通信汇总。
解释: 课本在 MPI 梯形法则中用 Foster 方法论分析任务、通信、聚合和映射,并以图示说明单个梯形面积与总和之间的通信。
来源: 课本OCR-并行程序设计导论 原书第2版 p.85;课本OCR-并行程序设计导论 原书第2版 p.90
3-课本补充-大题-2#
说明 MPI_Reduce、MPI_Allreduce、MPI_Bcast、MPI_Scatter 和 MPI_Gather 的核心区别。
答案: MPI_Reduce 把全局操作结果放到单个指定进程;MPI_Allreduce 把结果放到所有进程;MPI_Bcast 从单个源进程把数据发送给所有进程;MPI_Scatter 从根进程把不同数据块分散给各进程;MPI_Gather 把各进程数据块收集到根进程。
解释: 课本第3章小结和集合通信小节分别给出这些集合通信函数的用途。
来源: 课本OCR-并行程序设计导论 原书第2版 p.94;课本OCR-并行程序设计导论 原书第2版 p.96;课本OCR-并行程序设计导论 原书第2版 p.98;课本OCR-并行程序设计导论 原书第2版 p.117
3-课本补充-大题-3#
为什么发送零字节消息仍可能有非零运行时间?
答案: 即使 count 为 0,通信仍需要函数调用、进入 MPI 运行时、构造和处理消息信封、进行进程匹配与同步等控制操作。这些固定开销与消息数据字节数无关,因此零字节消息运行时间仍可能非零。
解释: 课本练习提出 count 为 0 的发送成本问题;前文对消息信封和发送语义的说明支持固定控制开销的解释。
来源: 课本OCR-并行程序设计导论 原书第2版 p.83;课本OCR-并行程序设计导论 原书第2版 p.124
第四章 Pthreads 进行共享内存编程#
填空题#
4-填空-1#
pthread_create 的线程入口函数类型必须是 `void* -> ________`。
答案: void*
解释: 资料函数原型注释写明线程入口函数必须是 void* 到 void*。
来源: 并行复习 p.35
4-填空-2#
pthread_join 会阻塞调用它的线程,直到目标线程正常________。
答案: 返回
解释: 资料说明 pthread_join 阻塞调用线程直到目标线程正常返回。
来源: 并行复习 p.35
4-填空-3#
竞争条件是多个线程同时读取某个共享变量并操作,变量值与线程执行________有关。
答案: 顺序
解释: 资料定义竞争条件时强调共享变量的值与线程执行顺序有关。
来源: 并行复习 p.36
4-填空-4#
互斥锁保证同一时刻只有________个线程可以进入临界区。
答案: 一
解释: 资料定义互斥锁保证同一时刻只有一个线程进入临界区。
来源: 并行复习 p.36
4-填空-5#
sem_wait 在信号量值大于 0 时会将其减________并继续执行。
答案: 一
解释: 资料说明 sem_wait 若信号量值 > 0,减一并继续执行。
来源: 并行复习 p.39
4-填空-6#
路障要求一组线程在某一点集合,等________线程都到达后再继续。
答案: 所有
解释: 资料定义路障为等所有线程到达后统一继续。
来源: 并行复习 p.39
4-填空-7#
条件变量通常需要搭配________锁一起使用。
答案: 互斥
解释: 资料说明条件变量需要搭配互斥锁一起使用。
来源: 并行复习 p.40
4-填空-8#
线程安全版本的 strtok 是 ________。
答案: strtok_r
解释: 资料说明可以使用线程安全版本 strtok_r。
来源: 并行复习 p.46
4-课本填空-1#
Pthreads 程序启动线程常用函数是 pthread_create,停止或等待线程完成常用函数是________。
答案: pthread_join
解释: 课本 Pthreads 小结说明,pthread_create 和 pthread_join 分别用于启动和停止一个线程函数。
来源: 课本OCR-并行程序设计导论 原书第2版 p.166
4-课本补充-填空-1#
课本把观察或调试时可能暂时消失的并发错误称为________。
答案: Heisenbugs
解释: 课本说明,附加调试器或添加 printf 可能改变线程相对时间,使错误似乎消失,这类错误称为 Heisenbugs。
来源: 课本OCR-并行程序设计导论 原书第2版 p.139
4-课本补充-填空-2#
忙等待实现栅栏时,如果要重复使用计数器,必须处理计数器________问题,否则第二个栅栏可能失效或挂起。
答案: 重置
解释: 课本说明第一个栅栏完成后 counter 等于 thread_count;若不能正确重置,第二个栅栏不会阻塞,或重置时导致线程挂起。
来源: 课本OCR-并行程序设计导论 原书第2版 p.149
4-课本补充-填空-3#
Pthreads 条件变量总是与一个________锁相关联。
答案: 互斥
解释: 课本介绍条件变量时明确说条件变量总是与一个互斥锁相关联。
来源: 课本OCR-并行程序设计导论 原书第2版 p.151
4-课本概念-填空-1#
从程序员角度看,共享内存系统是所有核心都可以访问所有________位置的系统。
答案: 内存
解释: 课本第4章开头回顾共享内存系统的定义。
来源: 课本OCR-并行程序设计导论 原书第2版 p.127
4-课本概念-填空-2#
互斥锁用于保证对临界区的________访问。
答案: 互斥
解释: 课本说明 mutex 是 mutual exclusion 的缩写,用于限制对临界区的访问,使一次只有一个线程访问。
来源: 课本OCR-并行程序设计导论 原书第2版 p.142
4-课本概念-填空-3#
二元信号量只使用两个值:________和1。
答案: 0
解释: 课本说明二元信号量只使用 0 和 1;0 对应锁定,1 对应解锁。
来源: 课本OCR-并行程序设计导论 原书第2版 p.146
4-课本概念-填空-4#
栅栏是一种同步点,在所有线程到达之前,没有线程可以________栅栏继续前进。
答案: 越过
解释: 课本定义栅栏为线程都处于同一位置的同步点,在所有线程到达前没有线程可以越过。
来源: 课本OCR-并行程序设计导论 原书第2版 p.148
判断题#
4-判断-1#
Pthreads 适合共享内存系统,同一台机器上的多个线程可以通过访问共享变量通信。
答案: 正确
解释: 资料说明 Pthreads 属于共享内存编程,本章重点包括线程之间如何通信,即访问共享变量。
来源: 并行复习 p.34
4-判断-2#
pthread_join 的作用是强制停止目标线程。
答案: 错误
解释: 资料说明 pthread_join 是等待线程结束的同步机制,不会停止线程,而是阻塞调用它的线程直到目标线程返回。
来源: 并行复习 p.35
4-判断-3#
临界区通常是更新共享变量的代码段,一次只能由一个线程进入。
答案: 正确
解释: 资料把临界区定义为一次只能由一个线程在内执行的代码段,通常用于更新共享变量。
来源: 并行复习 p.36
4-判断-4#
忙等待线程在等待条件时不会消耗 CPU。
答案: 错误
解释: 资料说明忙等待线程不停检查条件,期间没有做有用工作,只是在空转 CPU。
来源: 并行复习 p.36
4-判断-5#
信号量与互斥锁最大的区别之一是信号量不属于某个线程,并且可以允许多个线程进入临界区。
答案: 正确
解释: 复习资料明确列出这一差异。
来源: 并行复习 p.38
4-判断-6#
pthread_cond_wait 等待时会释放互斥锁,被唤醒后会重新加锁。
答案: 正确
解释: 资料把 pthread_cond_wait 分解为释放锁、等待信号、被唤醒后重新加锁三个动作。
来源: 并行复习 p.41
4-课本判断-1#
pthread_create 本身不要求传递线程编号,也不要求为线程分配固定序列号。
答案: 正确
解释: 课本指出,给线程分配序列号只是书中使用的一种方便惯例,并不是调用 pthread_create 的要求。
来源: 课本OCR-并行程序设计导论 原书第2版 p.132
4-课本补充-判断-1#
忙等待保护临界区会反复测试条件并消耗 CPU 周期,在比核心更多线程时性能可能严重下降。
答案: 正确
解释: 课本指出忙等待线程会在测试上旋转、消耗 CPU 周期;表格和事件序列说明线程数超过核心数时性能可能灾难性下降。
来源: 课本OCR-并行程序设计导论 原书第2版 p.140;课本OCR-并行程序设计导论 原书第2版 p.144
4-课本补充-判断-2#
pthread_cond_wait 阻塞线程时不会释放互斥锁,因此其他线程无法进入临界区。
答案: 错误
解释: 课本强调 pthread_cond_wait 会解锁关联互斥锁并阻塞;如果不解锁,只有一个线程能进入栅栏,程序会挂起。
来源: 课本OCR-并行程序设计导论 原书第2版 p.151;课本OCR-并行程序设计导论 原书第2版 p.152
4-课本概念-判断-1#
互斥锁会指定线程按编号顺序进入临界区。
答案: 错误
解释: 课本说明有了互斥锁后,线程进入临界区的顺序多多少少是随机的,由系统安排。
来源: 课本OCR-并行程序设计导论 原书第2版 p.143
4-课本概念-判断-2#
条件变量允许一个线程暂停执行,直到某个事件或条件发生。
答案: 正确
解释: 课本条件变量小节直接给出这个定义。
来源: 课本OCR-并行程序设计导论 原书第2版 p.151
4-课本概念-判断-3#
线程安全表示一个代码块由多个线程运行时仍能正常工作。
答案: 正确
解释: 课本第2章和第4章均给出线程安全定义:多个线程运行时可以正常工作。
来源: 课本OCR-并行程序设计导论 原书第2版 p.70
选择题#
4-选择-1#
启动 Pthreads 线程的函数是?
A. pthread_create B. pthread_join C. pthread_mutex_lock D. sem_post
答案: A
解释: 复习资料把 pthread_create 标为启动线程,并给出函数原型。
来源: 并行复习 p.34;并行复习 p.35
4-选择-2#
下列哪组函数最直接对应互斥量的常见生命周期?
A. pthread_mutex_init / pthread_mutex_lock / pthread_mutex_unlock / pthread_mutex_destroy B. MPI_Init / MPI_Send / MPI_Recv / MPI_Finalize C. cudaMalloc / cudaMemcpy / cudaFree D. omp_get_thread_num / omp_get_num_threads
答案: A
解释: 资料连续列出互斥量初始化、上锁、释放锁、销毁函数。
来源: 并行复习 p.36;并行复习 p.37
4-选择-3#
当线程数大于可用 CPU 核心数时,忙等待相比互斥量可能出现什么问题?
A. 性能严重下降甚至变差 B. 自动变成分布式内存 C. 消除所有同步开销 D. 保证矩阵乘法一定正确
答案: A
解释: 资料说明线程数大于可用核心时,忙等待同步性能严重下降甚至变差,而互斥量较稳定。
来源: 并行复习 p.37;并行复习 p.38
4-选择-4#
路障的含义是?
A. 一组线程在某一点集合,等所有线程到达后再继续 B. 只允许一个线程永久运行 C. 把所有线程销毁 D. 把共享变量复制到每个进程
答案: A
解释: 资料定义路障为让一组线程在某一点集合,等所有线程都到达后统一继续执行。
来源: 并行复习 p.39
4-选择-5#
为什么 `y[0]` 到 `y[7]` 被不同线程分别修改仍可能很慢?
A. 它们可能位于同一个 cache line,导致伪共享 B. 它们不在内存中 C. 整数不能被线程修改 D. pthread_join 会取消这些更新
答案: A
解释: 资料解释这些元素可能占据同一个 cache line,每次写导致整个 cache line 失效/同步,形成伪共享。
来源: 并行复习 p.44;并行复习 p.45
4-选择-6#
多线程环境中,`strtok` 可能出错的主要原因是?
A. 它内部使用共享的静态状态,线程之间可能互相覆盖上下文 B. 它不能分割字符串 C. 它只能在 MPI 中使用 D. 它自动加锁导致死锁
答案: A
解释: 资料说明 strtok 的静态函数指针变量被共享,线程 1 可能用错线程 0 留下的上下文;可用 strtok_r。
来源: 并行复习 p.45;并行复习 p.46
4-课本选择-1#
关于 sem_wait 与 sem_post,哪项符合课本描述?
A. sem_wait 在信号量非零时减一并继续,若为 0 则阻塞;sem_post 增加信号量并可能唤醒等待线程 B. sem_wait 总是立即返回且不修改信号量 C. sem_post 会减少信号量 D. 信号量不能用于互斥
答案: A
解释: 课本说明把二元信号量初始化为 1 可作为互斥锁使用;sem_wait 负责等待并减一,sem_post 负责增加信号量。
来源: 课本OCR-并行程序设计导论 原书第2版 p.146
4-课本补充-选择-1#
课本建议提高 Pthreads 求和性能的关键做法是什么?
A. 让每个线程先用私有变量累计局部和,最后只进一次临界区合并 B. 让每次循环迭代都加锁更新全局和 C. 用 printf 改变线程时序 D. 增加忙等待循环次数
答案: A
解释: 课本指出无论如何保护临界区都会序列化该段代码,因此应减少进入临界区次数;程序4.5 使用每线程私有 my_sum 后再合并。
来源: 课本OCR-并行程序设计导论 原书第2版 p.141
4-课本补充-选择-2#
关于条件变量的 signal 与 broadcast,哪项符合课本描述?
A. signal 唤醒一个阻塞线程,broadcast 唤醒所有阻塞线程 B. signal 会销毁条件变量 C. broadcast 只适用于一个线程 D. 二者都不需要互斥锁
答案: A
解释: 课本给出 pthread_cond_signal 和 pthread_cond_broadcast 的语义:前者解除一个阻塞线程,后者解除所有阻塞线程。
来源: 课本OCR-并行程序设计导论 原书第2版 p.151
4-课本概念-选择-1#
pthread_mutex_init 的第二个参数通常传入什么以使用默认属性?
A. NULL B. MPI_COMM_WORLD C. thread_count D. cudaFree
答案: A
解释: 课本说明不会使用 pthread_mutex_init 的第二个参数,传入 NULL 使用默认属性。
来源: 课本OCR-并行程序设计导论 原书第2版 p.142
4-课本概念-选择-2#
下列哪项是 sem_wait 在信号量为 0 时的行为?
A. 阻塞调用线程 B. 增加信号量 C. 销毁信号量 D. 创建新线程
答案: A
解释: 课本说明如果信号量为 0,执行 sem_wait 的线程将阻塞。
来源: 课本OCR-并行程序设计导论 原书第2版 p.146
4-课本概念-选择-3#
下列哪个函数用于唤醒条件变量上所有被阻塞的线程?
A. pthread_cond_broadcast B. pthread_cond_wait C. pthread_mutex_destroy D. pthread_join
答案: A
解释: 课本说明 pthread_cond_broadcast 将解除所有被阻塞的线程。
来源: 课本OCR-并行程序设计导论 原书第2版 p.151
大题#
4-大题-1#
分析在循环内部对全局变量加锁累加,为什么性能可能很差;给出更好的思路。
答案: 如果每次循环迭代都在 `global_sum += …` 前后加锁,那么临界区执行次数等于迭代次数,锁和解锁会发生大量次。其他线程需要等待,调度器还可能频繁唤醒和切换线程,CPU 周期消耗在同步和调度上,而不是有效计算。更好的思路是每个线程先用私有局部变量累计自己的部分,最后只进入一次临界区把局部结果合并到全局变量。
解释: 参考资料 3 直接分析了 Pthreads 求平方和的两个代码片段:循环内锁导致 N 次 lock/unlock,局部和再合并能减少同步。
来源: 参考资料3 para 2;参考资料3 para 36;参考资料3 para 37;参考资料3 para 38
4-大题-2#
比较忙等待、互斥量、信号量和条件变量的适用点。
答案: 忙等待通过反复检查条件来同步,能控制顺序但浪费 CPU,线程数超过核心数时性能可能很差。互斥量保证同一时刻只有一个线程进入临界区,适合保护共享变量更新,但进入顺序由系统调度决定。信号量适合一个线程等待另一个线程完成某些操作,也可以允许一定数量线程进入。条件变量用于等待某个条件成立,通常与互斥锁搭配,等待时释放锁,被唤醒后重新加锁。
解释: 答案分别来自忙等待、互斥量、信号量、条件变量小节。
来源: 并行复习 p.36;并行复习 p.37;并行复习 p.38;并行复习 p.39;并行复习 p.40;并行复习 p.41
4-大题-3#
解释伪共享的形成过程,并给出至少两种避免思路。
答案: 伪共享发生在多个线程修改不同变量,但这些变量落在同一个 Cache Line 中。某个线程修改自己的变量时,会使其他核心中同一 Cache Line 的副本失效;另一个线程再修改邻近变量时又要重新获取该 Cache Line,导致缓存行反复失效/同步,性能急剧下降。避免思路包括给结构体成员填充或对齐,让不同线程频繁写的变量落在不同 Cache Line;或者让每个线程先在私有局部变量中累加,最后再少量写回共享内存。
解释: 复习资料和参考资料 3 均解释了不同变量同处一个 cache line 导致性能下降,以及私有局部变量累加的改法。
来源: 并行复习 p.44;并行复习 p.45;参考资料3 para 162;参考资料3 para 166;参考资料3 para 172
4-课本大题-1#
课本为什么强调线程安全?以静态局部变量为例说明。
答案: 线程安全指一个代码块由多个线程运行时仍能正常工作。普通 C 局部变量从线程自己的栈分配,通常是私有的;但静态局部变量跨调用保持存在,在多个线程调用同一函数时实际上会被共享,可能导致意外的共享状态和竞争。因此,串行程序中可用的函数放到多线程程序中不一定安全。
解释: 课本在线程安全小节说明,静态局部变量会在调用函数的线程之间有效共享,这是串行函数在多线程程序中可能出错的重要原因。
来源: 课本OCR-并行程序设计导论 原书第2版 p.50;课本OCR-并行程序设计导论 原书第2版 p.70
4-课本补充-大题-1#
比较忙等待、互斥锁和信号量在控制线程顺序或临界区访问上的差异。
答案: 忙等待通过反复测试共享标志控制顺序,简单但浪费 CPU,且受优化和调度影响;互斥锁适合保护临界区,只保证互斥,不保证线程按编号顺序进入;信号量可表示资源计数或事件通知,二元信号量能像互斥锁一样使用,也能用于生产者-消费者式的消息到达通知。
解释: 课本分别讨论忙等待、自旋、互斥锁随机进入临界区、以及用信号量让线程发送消息。
来源: 课本OCR-并行程序设计导论 原书第2版 p.140;课本OCR-并行程序设计导论 原书第2版 p.143;课本OCR-并行程序设计导论 原书第2版 p.146;课本OCR-并行程序设计导论 原书第2版 p.147
4-课本补充-大题-2#
为什么用互斥锁数组直接改造线程消息传递示例仍可能崩溃?
答案: 如果线程0远领先于线程1,它可能在线程1设置给线程0的消息指针前,就锁住自己的互斥锁并执行打印;此时 messages[my_rank] 仍是 NULL,解除空指针引用会崩溃。问题不只是互斥访问,而是还需要表达“消息已经到达”的同步条件。
解释: 课本用两个线程的事件顺序说明,单纯在写和读周围加互斥锁仍可能让线程读取 NULL 指针。
来源: 课本OCR-并行程序设计导论 原书第2版 p.145;课本OCR-并行程序设计导论 原书第2版 p.146
4-课本补充-大题-3#
为什么条件变量等待通常应该放在 while 循环中?
答案: 线程可能因为 signal/broadcast 之外的事件解除阻塞,即虚假唤醒;即使确实被唤醒,条件也可能已被其他线程改变。因此等待返回后应重新检查条件,不满足就再次等待。
解释: 课本明确说明虚假唤醒存在,`pthread_cond_wait` 通常应放在 while 循环中;单线程唤醒时继续前也应确认条件。
来源: 课本OCR-并行程序设计导论 原书第2版 p.152
第五章 用 OpenMP 进行共享内存编程#
填空题#
5-填空-1#
OpenMP 的 pragma 总是以 `#pragma ________` 开始。
答案: omp
解释: 资料说明 OpenMP 的 pragma 总是以 `# pragma omp` 开始。
来源: 并行复习 p.47
5-填空-2#
`#pragma omp parallel` 并行块末尾有一个隐式________。
答案: barrier
解释: 资料提醒并行代码块末尾存在隐式 barrier。
来源: 并行复习 p.47
5-填空-3#
OpenMP 中,在 parallel 指令之前声明的变量默认是________变量。
答案: 共享
解释: 资料总结并行指令之前声明的变量默认共享。
来源: 并行复习 p.49
5-填空-4#
OpenMP 的 reduction 子句会为每个线程创建归约变量的________副本。
答案: 私有
解释: 资料说明 OpenMP 自动为每个线程创建 variable 的私有副本。
来源: 并行复习 p.50
5-填空-5#
`#pragma omp parallel for` 后面只能跟 ________ 循环。
答案: for
解释: 资料明确该指令后面只能跟 for 循环。
来源: 并行复习 p.50
5-填空-6#
如果第 i 次迭代依赖第 i-1 次迭代结果,就存在数据________,不能直接并行化。
答案: 依赖
解释: 资料用 a[i]=a[i-1]+1 说明数据依赖性冲突。
来源: 并行复习 p.51
5-填空-7#
schedule(static, 1) 在资料中表现为按线程轮转分配每次________个迭代。
答案: 一
解释: 资料用 12 次迭代、3 个线程、chunk size 为 1 展示轮转调度。
来源: 并行复习 p.54
5-填空-8#
atomic 通常只保护紧跟其后的________条共享变量更新语句。
答案: 一
解释: 资料说明 atomic 只保护接下来一条 C 语言赋值语句。
来源: 并行复习 p.58;并行复习 p.60
5-课本填空-1#
OpenMP 的 reduction 子句会为每个线程创建归约变量的________变量,运行时再按归约运算合并结果。
答案: 私有
解释: 课本解释 `reduction(+: global_result)` 时说明,OpenMP 为每个线程创建私有变量来存储线程结果,然后合并。
来源: 课本OCR-并行程序设计导论 原书第2版 p.185
5-课本补充-填空-1#
OpenMP 的 `parallel for` 指令通过在线程之间分配循环的________来并行化 for 循环。
答案: 迭代
解释: 课本说明 parallel for 指令分叉线程执行结构化块,并通过在线程之间分配 for 循环迭代来实现并行化。
来源: 课本OCR-并行程序设计导论 原书第2版 p.186
5-课本补充-填空-2#
schedule 子句中,`runtime` 类型表示调度方式在运行时由________变量确定。
答案: 环境
解释: 课本说明 runtime 调度是在运行时根据环境变量确定的。
来源: 课本OCR-并行程序设计导论 原书第2版 p.197
5-课本补充-填空-3#
课本 OpenMP 任务示例中,`taskwait` 作为任务的________,强迫当前任务等待子任务完成。
答案: 栅栏
解释: 课本 Fibonacci 示例说明 taskwait 指令作为任务的一个栅栏,等待子任务完成。
来源: 课本OCR-并行程序设计导论 原书第2版 p.214
5-课本概念-填空-1#
OpenMP 程序通常通过 `#pragma omp ________` 创建一组线程执行结构化块。
答案: parallel
解释: 课本 OpenMP 入门示例使用 `#pragma omp parallel` 分叉线程执行 Hello。
来源: 课本OCR-并行程序设计导论 原书第2版 p.175
5-课本概念-填空-2#
OpenMP 归约子句 `reduction(+:x)` 中的 `+` 表示归约________。
答案: 运算符
解释: 课本解释 reduction 时说明加号表示归约运算符是加法。
来源: 课本OCR-并行程序设计导论 原书第2版 p.185
5-课本概念-填空-3#
OpenMP `parallel for` 指令后面的结构化块必须是一个________循环。
答案: for
解释: 课本说明 parallel for 后的结构化块必须是 for 循环。
来源: 课本OCR-并行程序设计导论 原书第2版 p.186
5-课本概念-填空-4#
OpenMP schedule 子句的一般形式是 `schedule(<type>[, <________>])`。
答案: chunksize
解释: 课本给出 schedule 子句形式为 `schedule(<type>[, <chunksize>])`。
来源: 课本OCR-并行程序设计导论 原书第2版 p.197
判断题#
5-判断-1#
OpenMP 比 Pthreads 更高层,常用于对已有串行程序进行并行化。
答案: 正确
解释: 资料说明 pthread 更底层,需要程序员详细定义线程行为;OpenMP 抽象更高,甚至是为已有串行程序并行化设计。
来源: 并行复习 p.46
5-判断-2#
C/C++ 编译器如果不认识某个 `#pragma`,通常会忽略它而不报错。
答案: 正确
解释: 资料在 OpenMP 编译部分说明 pragma 用于给编译器建议或指示,不认识会忽略。
来源: 并行复习 p.47
5-判断-3#
`#pragma omp parallel` 并行块末尾存在隐式 barrier。
答案: 正确
解释: 资料说明并行代码块末尾会有隐式 barrier,等线程组所有线程完成后主线程继续。
来源: 并行复习 p.47
5-判断-4#
在 `#pragma omp parallel` 之前声明的变量默认在并行区中是私有变量。
答案: 错误
解释: 资料总结:parallel 指令之前声明的变量默认共享,并行代码块内部新声明的变量是私有的。
来源: 并行复习 p.49
5-判断-5#
OpenMP reduction 子句适合 `+`、`*`、`max` 等操作,资料中特别提醒减法 `-` 不适合作为普通归约操作。
答案: 正确
解释: 资料列出 op 是 `+`、`*`、`max` 等,并注明减法不行且给出反例。
来源: 并行复习 p.49
5-判断-6#
`#pragma omp atomic` 通常只保护紧跟在后面的一条共享变量更新语句。
答案: 正确
解释: 资料说明 atomic 只能保护接下来一条 C 语言赋值语句形成的临界区,只能保护一个共享变量的单一更新操作。
来源: 并行复习 p.58;并行复习 p.60
5-课本判断-1#
`#pragma omp parallel for` 后的结构化块必须是 for 循环,OpenMP 不会直接并行化 while 或 do-while 循环。
答案: 正确
解释: 课本在 parallel for 注意事项中说明,OpenMP 只对 for 循环并行化,不直接并行化 while 或 do-while。
来源: 课本OCR-并行程序设计导论 原书第2版 p.187
5-课本补充-判断-1#
只给 `global_result += Local_trap(…)` 加 critical 会使 Local_trap 调用本身也串行执行,虽正确但性能差。
答案: 正确
解释: 课本指出如果整个 `global_result += Local_trap(…)` 是临界区,那么 Local_trap 调用一次只能由一个线程执行,实际上让并行化失去意义。
来源: 课本OCR-并行程序设计导论 原书第2版 p.184
5-课本补充-判断-2#
OpenMP 中 `single` 常用于 task 示例,因为它可以防止每个线程都重复创建同一组任务。
答案: 正确
解释: 课本说明如果没有 single,每个函数调用将由所有线程执行;single 保证只有一个线程调用每个函数并创建任务。
来源: 课本OCR-并行程序设计导论 原书第2版 p.220
5-课本概念-判断-1#
OpenMP 的 reduction 子句会为每个线程创建归约变量的私有副本。
答案: 正确
解释: 课本说明 OpenMP 为每个线程创建私有变量保存结果,再合并。
来源: 课本OCR-并行程序设计导论 原书第2版 p.185
5-课本概念-判断-2#
dynamic 和 guided 调度都属于循环执行时再分配迭代的调度方式。
答案: 正确
解释: 课本 schedule 子句说明 dynamic 或 guided 的迭代在循环执行时分配。
来源: 课本OCR-并行程序设计导论 原书第2版 p.197
5-课本概念-判断-3#
task 指令创建的子任务一定会在当前语句返回前完成,因此不需要 taskwait。
答案: 错误
解释: 课本 Fibonacci 示例说明 task 最终会运行,但当前任务可能提前返回当前值,因此需要 taskwait 等待子任务完成。
来源: 课本OCR-并行程序设计导论 原书第2版 p.214
选择题#
5-选择-1#
创建指定线程数的 OpenMP 并行区应使用哪种写法?
A. #pragma omp parallel num_threads(thread_count) B. pthread_create(&thread,…) C. MPI_Comm_size(…) D. kernel<<<grid, block>>>()
答案: A
解释: 资料给出 `#pragma omp parallel num_threads(thread_count)`。
来源: 并行复习 p.47
5-选择-2#
在 OpenMP 梯形积分中,如果多个线程要合并到 `global_result`,下列哪种机制可以保护共享写?
A. #pragma omp critical B. MPI_ANY_TAG C. cudaFree D. pthread_join
答案: A
解释: 资料在梯形积分处说明 OpenMP 使用 `#pragma omp critical` 互斥访问合并结果的代码块。
来源: 并行复习 p.48;并行复习 p.49
5-选择-3#
`#pragma omp parallel for` 后面通常只能跟什么结构?
A. for 循环 B. while 循环 C. switch 语句 D. 任意函数定义
答案: A
解释: 资料明确指出该指令后面只能跟 for 循环。
来源: 并行复习 p.50
5-选择-4#
下面哪个循环不能直接并行化的主要原因是数据依赖?`for (int i=1;i<n;i++){ a[i]=a[i-1]+1; }`
A. 第 i 次迭代依赖第 i-1 次迭代结果 B. 循环变量 i 是私有的 C. 数组 a 太大 D. for 循环不能使用 `<`
答案: A
解释: 资料用这个例子说明第 i 次迭代使用 a[i-1],存在数据依赖,不能直接并行化。
来源: 并行复习 p.51;参考资料4 para 14
5-选择-5#
当循环迭代耗时差异很大时,哪类调度通常更适合负载均衡?
A. dynamic 或 guided B. 只用默认 static 大块划分 C. 完全不调度 D. 只使用 atomic
答案: A
解释: 资料说明 dynamic/guided 在循环执行时动态分配,更适合负载不均;static 开销小但可能不均衡。
来源: 并行复习 p.54;并行复习 p.55;并行复习 p.56
5-选择-6#
默认缺省调度在资料中被概括为哪种方式?
A. schedule(static, n/thread_count) B. schedule(dynamic, 1) C. schedule(guided, 1) D. runtime 随机
答案: A
解释: 资料说明默认缺省调度实际上就是 `schedule(static, n/thread_count)`。
来源: 并行复习 p.55
5-课本选择-1#
OpenMP schedule 子句中,dynamic 或 guided 的共同特点是什么?
A. 迭代在循环执行时分配,线程完成当前迭代集后可向运行时系统请求更多迭代 B. 所有迭代必须在编译期完全分配 C. 只能用于 while 循环 D. 只用于设置线程数
答案: A
解释: 课本 schedule 子句说明,dynamic 和 guided 都是在循环执行时分配迭代,线程完成当前迭代集后可请求更多迭代。
来源: 课本OCR-并行程序设计导论 原书第2版 p.197
5-课本补充-选择-1#
OpenMP schedule(static) 与 dynamic/guided 的关键区别是什么?
A. static 可在循环执行前分配迭代;dynamic/guided 在循环执行时分配迭代 B. static 只能用于 while 循环 C. dynamic/guided 不会产生调度开销 D. static 必须由环境变量决定
答案: A
解释: 课本 schedule 子句说明 static 在循环执行前分配,dynamic/guided 在循环执行时分配。
来源: 课本OCR-并行程序设计导论 原书第2版 p.197
5-课本补充-选择-2#
课本练习中用 Monte Carlo 方法估计 pi,OpenMP 并行版本最自然应对哪个计数使用 reduction?
A. 落在圆内的点数 number_in_circle B. 线程编号 C. 随机数种子数组地址 D. printf 次数
答案: A
解释: 课本编程作业要求使用归约子句来找到投掷在圆圈内的飞镖总数量。
来源: 课本OCR-并行程序设计导论 原书第2版 p.225
5-课本概念-选择-1#
OpenMP `critical` 指令的作用是?
A. 使线程对后续结构化代码块互斥访问 B. 创建 MPI 进程 C. 释放 CUDA 统一内存 D. 改变 Cache 行大小
答案: A
解释: 课本说明 critical 指令使线程对下面的结构化代码块互斥访问。
来源: 课本OCR-并行程序设计导论 原书第2版 p.181
5-课本概念-选择-2#
OpenMP `static` 调度的基本含义是?
A. 迭代可在循环执行前分配给线程 B. 线程完成当前块后动态请求更多块 C. 调度由环境变量决定 D. 由编译器完全忽略循环
答案: A
解释: 课本 schedule 子句说明 static 中迭代可以在循环执行前分配给线程。
来源: 课本OCR-并行程序设计导论 原书第2版 p.197
5-课本概念-选择-3#
OpenMP `taskwait` 最接近哪种同步语义?
A. 当前任务等待其子任务完成 B. 所有 MPI 进程退出 C. 只同步一个 CUDA warp D. 销毁线程池
答案: A
解释: 课本说明 taskwait 指令作为任务的栅栏,强迫任务等待子任务完成。
来源: 课本OCR-并行程序设计导论 原书第2版 p.214
大题#
5-大题-1#
为什么资料中的第一个 OpenMP pi 值估计并行版本有问题?如何修改?
答案: 问题在于 `factor` 在并行区外定义,默认共享,并且每次迭代的正负号依赖前一次迭代,存在数据依赖和共享变量竞争。修改思路是把 `factor` 设为 private,并在每次迭代中由 k 的奇偶性独立计算 `factor=1.0` 或 `-1.0`,同时对 `sum` 使用 `reduction(+:sum)`。
解释: 资料在 pi 值估计部分给出了错误版本、原因和更新后的 private(factor)+reduction 写法。
来源: 并行复习 p.52;并行复习 p.53
5-大题-2#
比较 static、dynamic、guided 调度,并说明负载不均衡循环应如何选择。
答案: static 在循环开始前分配固定块,调度开销最小,但如果迭代耗时差异大,会导致某些线程过重。dynamic 把迭代分成小块,线程完成后动态领取新块,负载均衡好但有同步调度开销。guided 也是动态调度,但开始块大、后期块逐渐减小,适合大规模迭代。若迭代工作量随 i 增大而显著变化,默认 static 大块划分可能让后段线程过重,应考虑 dynamic 或 guided。
解释: 答案来自循环调度、schedule 子句和调度方式区别部分。
来源: 并行复习 p.53;并行复习 p.54;并行复习 p.55;并行复习 p.56;参考资料4 para 28;参考资料4 para 29
5-大题-3#
比较 OpenMP 中 critical、atomic 和锁,并说明嵌套 critical 为什么可能死锁。
答案: atomic 适合保护一条简单的共享变量更新语句,只保护紧跟其后的单一更新。critical 可以保护更一般的代码段;未命名 critical 默认使用同一全局锁,命名 critical 可区分不同临界区。锁通常更适合互斥数据结构。若在一个未命名 critical 内再次进入未命名 critical,线程已持有外层锁又尝试获取同一把锁,会自己等待自己而死锁;即使命名不同,也可能出现两个线程分别持有不同锁并等待对方锁的交叉死锁。
解释: 复习资料在 atomic、critical、锁和嵌套 critical 死锁处均给出说明。
来源: 并行复习 p.58;并行复习 p.59;并行复习 p.60;参考资料4 para 86;参考资料4 para 92
5-课本大题-1#
用课本 OpenMP 梯形法例子说明 `global_result += my_result` 为什么是临界区,并给出两种修正方法。
答案: 多个线程都会读写共享变量 `global_result`,且更新顺序会影响结果;课本时间表展示了两个线程分别计算 1 和 2 时可能最终只保存其中一个更新。因此该语句是临界区。修正方法一是用 `#pragma omp critical` 让每次只有一个线程更新;方法二是使用 `reduction(+: global_result)`,让每个线程写私有副本,最后由 OpenMP 合并。
解释: 课本先用时间表展示 `global_result += my_result` 的竞争条件,随后给出 critical 和 reduction 两种 OpenMP 改法。
来源: 课本OCR-并行程序设计导论 原书第2版 p.180;课本OCR-并行程序设计导论 原书第2版 p.181;课本OCR-并行程序设计导论 原书第2版 p.185
5-课本大题-2#
课本中 OpenMP task/taskwait 的作用是什么?为什么 task 往往需要配合 single 使用?
答案: task 指令把函数调用或递归子问题创建为可由线程执行的任务;taskwait 像该任务的栅栏,强迫当前任务等待子任务完成后再继续使用结果。课本还说明,如果在 parallel 区中直接写多个函数调用,每个线程都会执行这些调用;single 可保证只有一个线程负责创建任务,再由线程组执行任务。
解释: 课本 Fibonacci 和函数调用示例分别解释了 taskwait 对子任务的等待,以及 single 防止所有线程重复创建同一批任务。
来源: 课本OCR-并行程序设计导论 原书第2版 p.214;课本OCR-并行程序设计导论 原书第2版 p.220
5-课本补充-大题-1#
为什么 OpenMP 的 `parallel for` 不能无条件用于所有 for 循环?
答案: OpenMP 只能直接并行化迭代次数可确定的 for 循环,不能直接并行化 while 或 do-while;更重要的是,循环迭代之间不能存在会改变结果的数据依赖。例如后一轮依赖前一轮结果的循环,直接并行化会破坏语义。
解释: 课本在 parallel for 注意事项中说明了 for 循环形式和迭代次数限制,前文也用数据依赖例子说明不能直接并行化。
来源: 课本OCR-并行程序设计导论 原书第2版 p.187
5-课本补充-大题-2#
根据课本练习,说明如何用 OpenMP 改写计数排序,以及主要性能风险。
答案: 计数排序对每个元素 a[i] 计算列表中小于它的元素个数,再写入 temp[count]。外层 i 循环的各次计算相对独立,可用 parallel for 分配给线程;每个线程使用私有 count 和循环变量。风险在于算法本身是 O(n^2),并且对相等元素的稳定性判断、temp 写入位置和内存访问模式都要正确处理,实际性能还要与串行 Count_sort 和 qsort 比较。
解释: 课本编程作业给出 Count_sort 串行代码,并要求实现并行版本、比较其与串行 Count_sort 和 qsort 的性能。
来源: 课本OCR-并行程序设计导论 原书第2版 p.225;课本OCR-并行程序设计导论 原书第2版 p.226
5-课本补充-大题-3#
课本练习中,矩阵-向量乘法为什么可能出现伪共享?两种缓解方式是什么?
答案: 如果多个线程写向量 y 中相邻元素,而这些元素落在同一缓存行上,不同处理器之间会不断使对方缓存行失效,即使线程写的是不同 y 元素,也会发生伪共享。缓解方式一是在 y 中填充,使不同线程同时写的元素不共享缓存行;方式二是让每个线程在私有存储中计算自己的 y 片段,完成后再复制到共享 y。
解释: 课本练习要求分析 8000x8000 矩阵-向量乘法中的伪共享,并提出填充 y 或使用线程私有 y 片段两种修改。
来源: 课本OCR-并行程序设计导论 原书第2版 p.223;课本OCR-并行程序设计导论 原书第2版 p.224
第六章 CUDA 异构编程#
填空题#
6-填空-1#
CUDA 中 CPU 端称为 host,GPU 端称为________。
答案: device
解释: 资料写明 CPU(host) 负责管理调度,GPU(device) 负责大规模并行计算。
来源: 并行复习 p.64
6-填空-2#
CUDA C 程序由 Host Code 和 ________ Code 两部分组成。
答案: Device
解释: 资料列出 Host Code 和 Device Code。
来源: 并行复习 p.64;并行复习 p.65
6-填空-3#
申请 GPU 显存使用 ________,释放 GPU 显存使用 cudaFree。
答案: cudaMalloc
解释: 资料列出 cudaMalloc 和 cudaFree。
来源: 并行复习 p.65
6-填空-4#
CUDA kernel 调用语法是 `kernel<<<gridDim, ________>>>(args);`。
答案: blockDim
解释: 资料给出 `kernel<<<gridDim, blockDim>>>(args);`。
来源: 并行复习 p.67
6-填空-5#
一维全局线程编号常写作 `blockDim.x * blockIdx.x + ________`。
答案: threadIdx.x
解释: 资料向量加法 kernel 示例使用该表达式。
来源: 并行复习 p.67
6-填空-6#
CUDA 线程组织三层是 Thread、Block 和 ________。
答案: Grid
解释: 资料列出 Thread、Block、Grid 三层。
来源: 并行复习 p.67
6-填空-7#
一个 warp 通常包含 ________ 个线程。
答案: 32
解释: 资料说明一个 warp 是 32 个线程。
来源: 并行复习 p.67;并行复习 p.68
6-填空-8#
`__syncthreads()` 是________级线程同步屏障。
答案: block
解释: 资料说明 `__syncthreads()` 适用于 block 级线程同步。
来源: 并行复习 p.69
6-填空-9#
Unified Memory 让 CPU 和 GPU 使用同一________访问内存。
答案: 指针
解释: 资料说明 Unified Memory 让 CPU 和 GPU 使用同一指针访问内存。
来源: 并行复习 p.71
6-填空-10#
共享内存 bank conflict 会导致访问被________化,从而降低性能。
答案: 串行
解释: 资料说明 bank conflict 时 CUDA 会串行化访问。
来源: 并行复习 p.71
6-课本填空-1#
CUDA 程序中,threadIdx.x 给出线程在其线程块中的相对索引;blockIdx.x 给出________在网格中的索引。
答案: 线程块
解释: 课本说明 threadIdx.x 是线程在块中的索引,blockIdx.x 是块在网格中的索引。
来源: 课本OCR-并行程序设计导论 原书第2版 p.235
6-课本补充-填空-1#
从主机角度看,CUDA 核函数调用通常是________的;若主机要使用设备结果,可调用 cudaDeviceSynchronize。
答案: 异步
解释: 课本小结说明核函数在设备上启动后,设备和主机可以同时执行;主机可通过 cudaDeviceSynchronize 阻塞等待设备完成。
来源: 课本OCR-并行程序设计导论 原书第2版 p.274
6-课本补充-填空-2#
CUDA 统一内存最常用的分配函数是________。
答案: cudaMallocManaged
解释: 课本小结给出 `cudaMallocManaged(void** ptr, size_t size)` 用于分配统一内存。
来源: 课本OCR-并行程序设计导论 原书第2版 p.275
6-课本补充-填空-3#
CUDA 中线程块集合称为________。
答案: 网格
解释: 课本小结说明由核函数启动的线程块集合称为网格。
来源: 课本OCR-并行程序设计导论 原书第2版 p.274
6-课本概念-填空-1#
CUDA 线程可通过 threadIdx、blockIdx、blockDim 和 ________ 获取网格信息。
答案: gridDim
解释: 课本第6章小结列出线程可检查的四个结构:threadIdx、blockIdx、blockDim、gridDim。
来源: 课本OCR-并行程序设计导论 原书第2版 p.274
6-课本概念-填空-2#
CUDA 中线程束中的线程以________方式执行。
答案: SIMD
解释: 课本小结说明线程束是线程块中线程的子集,线程束中的线程以 SIMD 方式执行。
来源: 课本OCR-并行程序设计导论 原书第2版 p.275
6-课本概念-填空-3#
CUDA 原子操作 `atomicAdd(xp, y)` 会把 y 加到 ________ 指向的内存位置。
答案: xp
解释: 课本给出 atomicAdd 语义:将 y 添加到 xp 指向的内存位置,并返回原始值。
来源: 课本OCR-并行程序设计导论 原书第2版 p.276
6-课本概念-填空-4#
共享内存被划分为多个________,若同一 warp 多线程访问同一库不同位置会串行化。
答案: 库
解释: 课本说明共享内存被划分为库,访问不同库可并行,访问同一库不同位置必须串行化。
来源: 课本OCR-并行程序设计导论 原书第2版 p.262;课本OCR-并行程序设计导论 原书第2版 p.277
判断题#
6-判断-1#
CUDA 是异构编程模型,CPU 作为 host 管理与调度,GPU 作为 device 负责大规模并行计算。
答案: 正确
解释: 资料明确给出 host/device 分工和通过 PCIe 通信的描述。
来源: 并行复习 p.64;并行复习 p.65
6-判断-2#
Host Code 运行在 GPU 上,Device Code 运行在 CPU 上。
答案: 错误
解释: 资料说明 Host Code 运行在 CPU 上,Device Code 运行在 GPU 上。
来源: 并行复习 p.64;并行复习 p.65
6-判断-3#
CUDA kernel 必须返回 void,且用 `__global__` 等关键字标记。
答案: 正确
解释: 资料把 kernel 定义为用特殊 CUDA 关键字定义的 C 函数,并列出必须返回 void。
来源: 并行复习 p.66
6-判断-4#
CUDA kernel 调用默认是异步的,调用后控制权会立刻返回 CPU。
答案: 正确
解释: 资料说明 CUDA 核函数与 OpenMP 隐式路障不同,是异步执行,调用完成后控制权立刻返回 CPU。
来源: 并行复习 p.67
6-判断-5#
CUDA 的线程组织层次是 Grid、Block、Thread;一个 kernel 调用会启动一个 grid。
答案: 正确
解释: 资料列出 Thread、Block、Grid 三层,并说明每次 kernel 调用相当于启动一个 grid。
来源: 并行复习 p.67
6-判断-6#
`__syncthreads()` 会同步整个 grid 中的所有线程。
答案: 错误
解释: 资料说明 `__syncthreads()` 在一个 block 内所有线程之间建立同步屏障,适用于 block 级线程同步。
来源: 并行复习 p.69
6-课本判断-1#
CUDA 核函数执行是异步的,主机线程在启动核函数后通常会继续执行。
答案: 正确
解释: 课本指出普通 C 函数与 CUDA 核函数的重要区别之一是核函数执行异步,主机不会像普通函数调用那样一直等待函数体执行完才返回。
来源: 课本OCR-并行程序设计导论 原书第2版 p.233
6-课本补充-判断-1#
不能把主机栈上变量的地址直接传给 CUDA 核函数来模拟引用传递,因为该地址在设备上无效。
答案: 正确
解释: 课本统一内存小结明确提醒,指针若指向主机栈中内存位置,不能传给核函数;实现引用传递效果可用 cudaMallocManaged。
来源: 课本OCR-并行程序设计导论 原书第2版 p.275
6-课本补充-判断-2#
如果多个线程访问同一共享内存库中的不同位置,CUDA 可以总是并行完成这些访问。
答案: 错误
解释: 课本共享内存库说明,若多个线程访问单个库中的不同内存位置,访问必须串行化;只有访问不同库,或读取同一库同一位置广播,才能避免该类串行化。
来源: 课本OCR-并行程序设计导论 原书第2版 p.262
6-课本概念-判断-1#
默认情况下,设备上一次只运行一个核函数;若主机先启动 Kernel_a 再启动 Kernel_b,二者按启动顺序执行。
答案: 正确
解释: 课本第6章小结说明默认情况下设备上一次只运行一个核函数,主机按顺序启动的核函数按顺序执行。
来源: 课本OCR-并行程序设计导论 原书第2版 p.274
6-课本概念-判断-2#
线程束洗牌允许线程读取同一线程束中另一个线程的寄存器。
答案: 正确
解释: 课本说明线程束洗牌允许线程读取属于同一线程束中另一个线程的寄存器。
来源: 课本OCR-并行程序设计导论 原书第2版 p.276
6-课本概念-判断-3#
`__syncthreads()` 可以同步普通网格中的所有线程块。
答案: 错误
解释: 课本明确说明 `__syncthreads()` 只同步一个线程块中的线程,不能同步普通网格中的线程。
来源: 课本OCR-并行程序设计导论 原书第2版 p.260
选择题#
6-选择-1#
Host Code 的主要职责不包括哪一项?
A. 控制程序流程 B. 数据分配和传输 C. 调用 GPU D. 作为每个 GPU 线程执行的 kernel
答案: D
解释: 资料说明 Host Code 运行在 CPU 上,负责控制流程、数据分配传输和调用 GPU;kernel 属于 Device Code。
来源: 并行复习 p.65
6-选择-2#
一维 CUDA kernel 中常见的全局线程编号计算式是?
A. blockDim.x * blockIdx.x + threadIdx.x B. MPI_Comm_rank + MPI_Comm_size C. omp_get_thread_num() + pthread_join() D. gridDim.x / blockDim.x
答案: A
解释: 资料在向量加法 kernel 示例中使用 `int tid = blockDim.x * blockIdx.x + threadIdx.x;`。
来源: 并行复习 p.67
6-选择-3#
资料中一个 warp 通常包含多少个线程?
A. 8 B. 16 C. 32 D. 1024
答案: C
解释: 资料说明一个 warp 是 32 个线程。
来源: 并行复习 p.67;并行复习 p.68
6-选择-4#
下列哪种分支更容易在同一个 warp 内造成分支分化?
A. if (threadIdx.x % 2) … else … B. if (blockIdx.x % 2) … else … C. 所有线程执行完全相同路径 D. 没有 if/else 的循环
答案: A
解释: 资料说明 `threadIdx.x` 是同一个 warp 内不同线程编号,不同线程走不同分支会导致分支分化;`blockIdx.x` 示例不会。
来源: 并行复习 p.69
6-选择-5#
CUDA 存储层次中,哪一类内存由一个线程块内线程共享,位于片上?
A. 共享内存 B. 本地内存 C. 全局内存 D. 常量内存
答案: A
解释: 资料表格和后文说明共享内存是 GPU 片上内存,由一个线程块内所有线程共享。
来源: 并行复习 p.70;并行复习 p.71
6-选择-6#
统一内存的主要优点和代价是?
A. 简化编程,但底层仍需迁移数据,性能可能低于显式内存管理 B. 完全消除 CPU-GPU 通信 C. 只能在一个线程块内访问 D. 要求程序员手写每次 PCIe 传输
答案: A
解释: 资料说明 Unified Memory 让 CPU/GPU 使用同一指针并自动迁移数据,简化编程但可能牺牲性能,高性能计算中手动管理仍更常用。
来源: 并行复习 p.71
6-课本选择-1#
关于 CUDA 统一内存,哪项符合课本描述?
A. cudaMallocManaged 分配的指针可在主机和设备上使用,但统一内存核函数可能比显式区分主机/设备内存更慢 B. 统一内存要求程序员手动写每次 cudaMemcpy C. 统一内存只能被 CPU 使用 D. 统一内存保证所有 GPU 程序最快
答案: A
解释: 课本说明 cudaMallocManaged 的指针可在主机和设备上使用,简化编程;但统一内存核函数可能比显式处理设备内存和主机内存更慢。
来源: 课本OCR-并行程序设计导论 原书第2版 p.240
6-课本补充-选择-1#
课本用 atomicAdd 优化讨论说明,减少调用 atomicAdd 的线程数量主要为了什么?
A. 降低全局求和等操作的原子更新开销 B. 让每个线程打印更多文本 C. 取消所有共享内存 D. 使核函数变成同步调用
答案: A
解释: 课本梯形法性能讨论指出,在更快 GPU 上,通过编程减少调用 atomicAdd 的线程数量是值得的。
来源: 课本OCR-并行程序设计导论 原书第2版 p.264;课本OCR-并行程序设计导论 原书第2版 p.276
6-课本补充-选择-2#
CUDA 双调排序单线程块版本中,为什么每个阶段后需要 `__syncthreads()`?
A. 不同线程的 compare-swap 存在阶段依赖,若阶段顺序交错会得到错误列表 B. 因为 printf 必须排序 C. 因为所有内存都是主机栈内存 D. 因为 blockIdx.x 不能被读取
答案: A
解释: 课本用 4 元素蝶式交换事件序列说明,如果线程0下一阶段比较先于线程1上一阶段比较执行,最终列表可能不有序,因此需要同步。
来源: 课本OCR-并行程序设计导论 原书第2版 p.270;课本OCR-并行程序设计导论 原书第2版 p.271
6-课本概念-选择-1#
若调用 `My_kernel<<<4,256>>>(x,y,n)`,blockDim.x 等于多少?
A. 256 B. 4 C. 1024 D. 0
答案: A
解释: 课本小结用该调用说明 gridDim.x=4,blockDim.x=256。
来源: 课本OCR-并行程序设计导论 原书第2版 p.274
6-课本概念-选择-2#
CUDA 中用于等待设备执行完成的主机函数是?
A. cudaDeviceSynchronize B. pthread_join C. MPI_Finalize D. omp_get_wtime
答案: A
解释: 课本说明主机若想使用设备结果,可以调用 cudaDeviceSynchronize 并阻塞到设备完成。
来源: 课本OCR-并行程序设计导论 原书第2版 p.274
6-课本概念-选择-3#
下列哪项是共享内存库冲突的典型情形?
A. 同一 warp 多个线程访问同一库中的不同地址 B. 多个线程读取同一库同一位置并广播 C. 每个线程访问不同库 D. 主机调用 cudaFree
答案: A
解释: 课本说明多个线程访问同一库中不同内存位置时必须串行化;读取同一位置可广播。
来源: 课本OCR-并行程序设计导论 原书第2版 p.262
大题#
6-大题-1#
说明一个简单 CUDA 向量加法程序的 host-device 基本流程。
答案: Host 端先准备输入数据并用 cudaMalloc 申请 GPU 显存,然后用 cudaMemcpyHostToDevice 将数据从 CPU 拷贝到 GPU。随后调用 `__global__` kernel,kernel 中每个线程通过 `blockDim.x * blockIdx.x + threadIdx.x` 计算自己的全局编号并处理一个或一段数据。kernel 调用后可用 cudaDeviceSynchronize 等待 GPU 完成,再用 cudaMemcpyDeviceToHost 把结果拷回 CPU,最后 cudaFree 释放 GPU 显存。
解释: 答案综合资料中的 cudaMalloc/cudaMemcpy/cudaFree、kernel、线程编号和同步说明。
来源: 并行复习 p.65;并行复习 p.66;并行复习 p.67;课程要点-CUDA体系结构 para 4;课程要点-CUDA体系结构 para 5;课程要点-CUDA体系结构 para 6
6-大题-2#
解释 warp 分支分化和 divergent loop 为什么会降低性能。
答案: 一个 warp 中的线程按 SIMD 模式执行,同一时刻只能执行同一条指令。如果同一个 warp 内线程因为 `threadIdx.x` 等条件进入不同分支,硬件会先执行一条路径并屏蔽另一部分线程,再执行另一条路径并屏蔽前一部分线程,等价于串行化不同路径。divergent loop 也是类似:循环次数不同的线程在每一轮中只有尚未结束的线程继续执行,其他线程被屏蔽,导致有效并行度下降。
解释: 资料在分支分化和 divergent loop 小节直接解释了两次路径执行和循环轮次屏蔽。
来源: 并行复习 p.68;并行复习 p.69;课程要点-CUDA体系结构 para 11;课程要点-CUDA体系结构 para 12
6-大题-3#
概述 CUDA 内存模型,并解释共享内存 bank conflict 及一种避免方法。
答案: CUDA 存储层次包括寄存器、本地内存、共享内存、全局内存和常量内存。寄存器属于线程且在片上;本地内存虽然名字叫本地,但大数组等可能存放在片外;共享内存位于片上,由一个 block 内线程共享;全局内存和常量内存可被所有线程访问。共享内存被划分为多个 memory bank,如果同一 block 内多个线程在同一时钟周期访问同一 bank 的不同地址,就会发生 bank conflict,访问被串行化、性能下降。避免方法包括让不同线程访问不同 bank,或通过 padding 改变地址映射。
解释: 资料的 CUDA 内存模型表格和共享内存 bank conflict 小节给出这些点;体系结构 DOCX 也标注了 GPU memory structures 对应课本页码。
来源: 并行复习 p.70;并行复习 p.71;并行复习 p.72;课程要点-计算机体系结构-量化研究方法-第六版-第四章 para 14;课程要点-CUDA体系结构 para 15;课程要点-CUDA体系结构 para 16
6-课本大题-1#
说明 CUDA 中 warp 分歧和 `__syncthreads()` 的两个重要限制。
答案: 一个 warp 当前通常包含 32 个线程,并以单指令流多数据流方式运行;同一 warp 内线程走不同 if-else 分支时会发生分歧,分支路径需要分别执行,影响效率。`__syncthreads()` 的限制有两点:第一,块中所有线程都必须执行到该调用,否则部分线程会永久等待;第二,它只同步同一个线程块内的线程,不能同步普通网格中的不同线程块。
解释: 课本分别在 warp 小节和 `__syncthreads()` 警告中说明了分歧、所有线程都必须调用、以及只同步一个块。
来源: 课本OCR-并行程序设计导论 原书第2版 p.253;课本OCR-并行程序设计导论 原书第2版 p.259;课本OCR-并行程序设计导论 原书第2版 p.260
6-课本补充-大题-1#
解释 CUDA 统一内存的便利性和限制。
答案: 统一内存通过 cudaMallocManaged 分配,返回的指针在主机和设备上都有效,系统会在主机和设备之间自动复制更新的数据,简化了显式 cudaMemcpy 管理。但统一内存不能让设备访问主机栈变量地址;在某些设备上主机和设备不能同时访问同一统一内存;性能也可能比显式区分主机/设备内存更慢。
解释: 课本统一内存段落说明了 cudaMallocManaged 的语义、主机栈指针限制和统一内存可能较慢的注意事项。
来源: 课本OCR-并行程序设计导论 原书第2版 p.240;课本OCR-并行程序设计导论 原书第2版 p.275
6-课本补充-大题-2#
比较 CUDA 线程束洗牌和共享内存在树形求和中的作用。
答案: 两者都用于快速实现树结构全局求和,减少昂贵的全局原子更新。线程束洗牌允许同一 warp 内线程读取其他线程寄存器中的值,可用 `__shfl_down_sync` 做树形合并;共享内存方案把中间结果存入块内共享内存,再用块内同步保证各 warp 结果可见。共享内存方案还要注意 bank conflict。
解释: 课本说明 CUDA 提供线程束洗牌和共享内存两种快速树结构操作替代方法,并给出共享内存同步和库冲突分析。
来源: 课本OCR-并行程序设计导论 原书第2版 p.261;课本OCR-并行程序设计导论 原书第2版 p.262;课本OCR-并行程序设计导论 原书第2版 p.276
6-课本补充-大题-3#
为什么并行双调排序在小输入上不一定比 qsort 快,但在大输入上可能明显更快?
答案: 小输入时 GPU 启动、同步和并行算法额外步骤的开销占比高,课本 2048 个整数实验中 qsort 比单块并行双调排序更快或相近;大输入时大量线程块和线程能充分利用 GPU 并行度,课本 2,097,152 个整数实验中并行双调排序比串行 qsort 快 40 多倍。
解释: 课本表 6.18 和 6.19 比较了小列表和大列表上 qsort、串行双调排序和并行双调排序的运行时间。
来源: 课本OCR-并行程序设计导论 原书第2版 p.273