多核与GPU编程:工具、方法及实践 计算机与互联网 书籍|5206918

多核与GPU编程:工具、方法及实践 计算机与互联网 书籍|5206918 pdf epub mobi txt 电子书 下载 2025

阿联酋 杰拉西莫斯 巴拉斯Gerassi 著,张云泉 译
图书标签:
  • 多核编程
  • GPU编程
  • 并行计算
  • 高性能计算
  • CUDA
  • OpenMP
  • 异构计算
  • 计算机科学
  • 编程技术
  • 实践指南
想要找书就要到 静思书屋
立刻按 ctrl+D收藏本页
你会得到大惊喜!!
店铺: 互动出版网图书专营店
出版社: 机械工业出版社
ISBN:9787111557685
商品编码:11554590193
丛书名: 高性能计算技术丛书
出版时间:2017-02-01

具体描述

 书[0名0]:  多核与GPU编程:工具、方[0法0]及实践|5206918
 图书定价: 129元
 图书作者: (阿联酋)杰拉西莫斯·巴拉斯(Gerassimos Barlas)
 出版社:  机械工业出版社
 出版日期:  2017/2/1 0:00:00
 ISBN号: 9787111557685
 开本: 16开
 页数: 0
 版次: 1-1
 作者简介
Gerassimos Barlas 沙迦美[0国0][0大0][0学0]计算机科[0学0]与工程系教授。他的研究兴趣包括并行算[0法0]、开发、分析,以及负载平衡的建模框架,分布式视频点播。Barlas教授讲授并行编程课程已有12年时间,早在20世纪90年代,他就开始研究并行计算,并积[0极0]参与并行和分布式系统可分负载理论这一新[0领0]域的研究工作。
 内容简介
本书从并行软件的实现、调试、[0优0]化和剖析四个方面,详细讨论了[0当0]前主要的并行计算关键技术,主要内容包括:多核和并行程序设计、共享内存编程中的线程与OpenMP、分布式内存编程、GPU编程、Thrust模板库、负载均衡等。本书结合具体的代码和案例分析,揭示了如何使用库或者指令创建多核应用,如何使用MPI开发分布式应用程序,如何使用CUDA开发高性能GPU程序,如何实现负载均衡,以及如何针对目标多核平台进行程序剖析和调试等。本书可供从事高性能计算技术研究的专业人员参考,也可作为高校相关专业的教[0学0]用书。
 目录

译者序
前 言
[0第0]1章 概述 1
1.1 多核计算机时代 1
1.2 并行计算机的分类 3
1.3 现代计算机概览 4
1.3.1 Cell BE处理器 5
1.3.2 NVIDIA Kepler 6
1.3.3 AMD APU 9
1.3.4 从多核到众核:Tilera TILE-Gx8072和Intel Xeon Phi 10
1.4 性能指标 12
1.5 并行程序性能的预测与测量 16
1.5.1 Amdahl定律 18
1.5.2 Gustafson-Barsis定律 20
[0第0]2章 多核和并行程序设计 23
2.1 引言 23
2.2 PCAM方[0法0][0学0] 24
2.3 分解模式 26
2.3.1 任务并行 27
2.3.2 分而治之分解 28
2.3.3 几何分解 30
2.3.4 递归数据分解 32
2.3.5 流水线分解 35
2.3.6 基于事件的合作分解 39
2.4 程序结构模式 39
2.4.1 单程序多数据 40
2.4.2 多程序多数据 40
2.4.3 主/从 41
2.4.4 map-reduce 41
2.4.5 fork/join 42
2.4.6 循环并行 44
2.5 匹配分解模式和程序结构模式 44
[0第0]3章 共享内存编程:线程 46
3.1 引言 46
3.2 线程 48
3.2.1 线程的定义 48
3.2.2 线程的作用 49
3.2.3 线程的生成和初始化 49
3.2.4 在线程间共享数据 55
3.3 设计考虑 57
3.4 信号量 58
3.5 经典问题中的信号量 62
3.5.1 生产者–消费者 63
3.5.2 终止处理 66
3.5.3 理发师问题:引入公平性 75
3.5.4 读者–写者问题 80
3.6 monitor 84
3.6.1 设计方[0法0]1:monitor内部的关键区 87
3.6.2 设计方[0法0]2:monitor控制关键区的入口 87
3.7 经典问题中的monitor 91
3.7.1 重新考虑生产者–消费者问题 91
3.7.2 重新考虑读者–写者问题 95
3.8 动态线程管理与静态线程管理 102
3.8.1 Qt线程池 102
3.8.2 线程池的创建和管理 103
3.9 调试多线程应用 111
3.10 高层次结构:无须显式利用线程的多线程编程 115
3.10.1 并发map 116
3.10.2 map-reduce 118
3.10.3 并发过滤 120
3.10.4 filter-reduce 121
3.10.5 案例研究:多线程存储 122
3.10.6 案例研究:多线程图像匹配 131
[0第0]4章 共享内存编程:OpenMP 140
4.1 引言 140
4.2 个OpenMP程序 141
4.3 变量作用域 144
4.3.1 定积分OpenMP版本V.0:人工划分 146
4.3.2 定积分OpenMP版本 V.1:无竞争条件的人工划分 147
4.3.3 定积分OpenMP V.2:基于锁的隐式划分 148
4.3.4 定积分OpenMP V.3:基于归约的隐式划分 150
4.3.5 变量作用域总结 151
4.4 循环级并行 152
4.4.1 数据依赖 154
4.4.2 嵌套循环 162
4.4.3 调度 162
4.5 任务并行 166
4.5.1 sections指令 166
4.5.2 task指令 171
4.6 同步结构 177
4.7 正确性与[0优0]化问题 183
4.7.1 线程安全 183
4.7.2 假共享 187
4.8 案例研究:OpenMP中的排序算[0法0] 192
4.8.1 自下而上归并排序算[0法0]的OpenMP实现 192
4.8.2 自上而下归并排序算[0法0]的OpenMP实现 195
4.8.3 性能[0评0]估 200
[0第0]5章 分布式内存编程 203
5.1 通信进程 203
5.2 MPI 204
5.3 核心概念 205
5.4 你的个MPI程序 206
5.5 程序体系结构 208
5.5.1 SPMD 208
5.5.2 MPMD 209
5.6 点对点通信 210
5.7 可选的点对点通信模式 214
5.8 非阻塞通信 216
5.9 点对点通信小结 220
5.10 错误报告与处理 220
5.11 集合通信简介 222
5.11.1 分发 226
5.11.2 收集 231
5.11.3 归约 233
5.11.4 多对多收集 237
5.11.5 多对多分发 240
5.11.6 多对多归约 245
5.11.7 全局同步 245
5.12 通信对象 245
5.12.1 派生数据类型 246
5.12.2 打包/解包 253
5.13 节点管理:通信器和组 254
5.13.1 创建组 255
5.13.2 建立内部通信器 257
5.14 单边通信 259
5.14.1 RMA通信函数 261
5.14.2 RMA同步函数 262
5.15 I/O注意事项 270
5.16 MPI多进程和多线程混合编程 276
5.17 时序和性能测量 279
5.18 调试和分析MPI程序 279
5.19 Boost.MPI库 283
5.19.1 阻塞和非阻塞通信 285
5.19.2数据序列化 289
5.19.3集合通信 292
5.20 案例研究:有限扩散聚合模型 295
5.21 案例研究:暴力加密破解 300
5.21.1 版本1:“基本型”MPI 300
5.21.2 版本2:MPI与OpenMP的结合 305
5.22 案例研究:主/从式并行模型的MPI实现 308
5.22.1 简单主/从式设置 309
5.22.2 多线程主/从式设置 316
[0第0]6章 GPU编程 333
6.1 GPU编程简介 333
6.2 CUDA编程模型:线程、线程块、线程网格 335
6.3 CUDA执行模型:流多处理器和warp 340
6.4 CUDA程序编译过程 344
6.5 构建CUDA项目 347
6.6 内存层次结构 349
6.6.1 本地内存/寄存器 355
6.6.2 共享内存 356
6.6.3 常量内存 363
6.6.4 texture和surface内存 368
6.7 [0优0]化技术 369
6.7.1 线程组织设计 369
6.7.2 kernel结构 378
6.7.3 共享内存访问 382
6.7.4 全局内存访问 388
6.7.5 page-locked与zero-copy内存 392
6.7.6 统一内存 394
6.7.7 异步执行和流 397
6.8 动态并行 403
6.9 CUDA程序的调试 407
6.10 CUDA程序剖析 410
6.11 CUDA和MPI 412
6.12 案例研究 417
6.12.1 分形集合计算 417
6.12.2 块加密算[0法0] 426
[0第0]7章 Thrust模板库 452
7.1 引言 452
7.2 使用Thrust的步 453
7.3 Thrust数据类型 456
7.4 Thrust算[0法0] 459
7.4.1 变换算[0法0] 460
7.4.2 排序与查询 463
7.4.3 归约 468
7.4.4 scan /前缀和 471
7.4.5 数据管理与处理 472
7.5 花式迭代器 475
7.6 交换设备后端 480
7.7 案例研究 481
7.7.1 蒙特卡洛积分 481
7.7.2 DNA序列比对 485
[0第0]8章 负载均衡 493
8.1 引言 493
8.2 动态负载均衡:Linda的遗赠 494
8.3 静态负载均衡:可分负载理论方[0法0] 495
8.3.1 建模开销 496
8.3.2 通信设置 502
8.3.3 分析 503
8.3.4 总结:简短的文献综述 510
8.4 DLTlib:分割工作负载的库 513
8.5 案例研究 516
8.5.1 Mandelbrot集“电影”的混合计算:动态负载均衡案例研究 516
8.5.2 分布式块加密:静态负载均衡案例研究 526
在线资源
附录A 编译Qt程序
附录B 运行MPI程序:准备与配置步骤
附录C 测量时间
附录D Boost.MPI
附录E CUDA环境搭建
附录F DLTlib
术语表
参考文献


《高性能计算:从并行架构到现代开发实践》 内容简介: 本书旨在为读者提供一个全面而深入的理解高性能计算(HPC)的视角,涵盖了从底层并行硬件架构的原理,到支撑现代HPC应用的软件工具链和开发方法论,再到在实际科学研究和工程领域中解决复杂问题的实践经验。本书并非一本介绍特定计算平台或编程语言的手册,而是着眼于跨越不同硬件异构性、统一软件开发范式,以及如何在瞬息万变的计算环境中高效地设计、实现和优化大规模并行应用程序。 第一部分:并行计算的基础与架构演进 高性能计算的基石在于其能够处理海量数据并执行极其复杂的计算任务。本部分将深入剖析现代并行计算的硬件基础,揭示其演进的脉络。 摩尔定律的终结与并行时代的来临: 分析单核处理器性能增长瓶颈,阐述多核、众核(GPU)等并行硬件架构兴起的必然性。探讨CPU和GPU在设计理念、核心数量、线程模型、内存层次结构等方面的根本差异,理解它们各自的优势与适用场景。 内存层次结构与数据局部性: 详细介绍现代计算系统中多级缓存(L1, L2, L3)、主内存(DRAM)以及外存(SSD, HDD)的工作原理,以及它们对程序性能的影响。强调数据局部性(时间局部性与空间局部性)的重要性,以及如何通过优化数据访问模式来提升程序效率。 互连网络与分布式系统: 探讨大规模HPC集群中的节点间通信机制,包括常见的互连技术(如InfiniBand, Ethernet)的性能特点和拓扑结构。介绍分布式共享内存(DSM)和消息传递接口(MPI)等模型,为理解大规模并行计算的分布式特性奠定基础。 异构计算的兴起: 深入分析CPU与GPU协同工作的原理,阐述GPGPU(General-Purpose computing on Graphics Processing Units)技术的发展历程,以及其在科学计算、机器学习、图形渲染等领域的广泛应用。讨论FPGA(Field-Programmable Gate Array)等其他可重构计算器件的潜力与挑战。 体系结构对编程模型的影响: 分析不同硬件架构(SMP, NUMA, Cluster, GPU)对软件设计的影响,以及它们如何催生出不同的并行编程模型和工具。 第二部分:并行编程模型与主流工具链 理解硬件架构只是第一步,如何有效地利用这些并行资源才是关键。本部分将系统介绍实现并行计算的各种编程模型和与之配套的开发工具。 共享内存并行编程: OpenMP: 详细讲解OpenMP的指令级并行(ILP)和线程级并行(TLP)指令,涵盖并行区域、任务并行、同步机制(临界区、原子操作、屏障)等核心概念。通过丰富的示例,演示如何将串行代码逐步改造为OpenMP并行程序,并分析常见的性能陷阱(如竞争条件、死锁、假共享)。 Pthreads: 介绍POSIX Threads(Pthreads)这一底层的线程API,理解线程的创建、同步(互斥锁、条件变量)、管理等细节。虽然Pthreads更为底层,但对其的理解有助于深入把握多线程编程的本质。 分布式内存并行编程: MPI(Message Passing Interface): 系统阐述MPI标准,涵盖点对点通信(Send/Recv)、集体通信(Broadcast, Reduce, Scatter, Gather, Allreduce)、拓扑通信等。重点分析MPI程序的结构、数据分发策略(Domain Decomposition, Data Decomposition)、以及如何避免通信瓶颈。通过实际案例,展示MPI在解决大规模分布式问题中的强大能力。 GPU编程模型: CUDA(Compute Unified Device Architecture): 深入讲解NVIDIA GPU的编程模型,包括内核函数(Kernel)、线程块(Thread Block)、线程(Thread)、网格(Grid)的概念。阐述GPU的内存模型(全局内存、共享内存、寄存器、常量内存、纹理内存)及其访问特性,以及如何利用CUDA API进行设备管理、内存分配、Kernel启动和同步。重点讨论warp调度、线程束(Warp)行为、内存合并(Memory Coalescing)、共享内存的有效利用等对性能至关重要的因素。 OpenCL(Open Computing Language): 介绍OpenCL作为一种开放的、跨平台的并行计算框架。对比OpenCL与CUDA的异同,讲解其核心概念(Platform, Device, Context, Command Queue, Kernel, Memory Objects),并展示如何在不同硬件(CPU, GPU, FPGA)上实现统一的并行计算。 OpenACC(Open Accelerators): 讲解OpenACC的指令化并行模型,如何通过简单的编译器指令(pragma acc data, pragma acc kernels, pragma acc loop)将CPU代码迁移到GPU上,实现“pragma-driven”的加速。分析OpenACC的优势(易用性)与局限性。 混合并行编程: 介绍如何结合OpenMP和MPI(MPI+OpenMP)以及CUDA和MPI(MPI+CUDA)等混合编程模型,充分利用多核CPU和GPU的并行能力,构建更强大的HPC应用程序。 第三部分:高性能计算的开发实践与优化策略 拥有了编程工具,更需要掌握一套行之有效的方法论来开发高效、可靠的并行应用程序。本部分将聚焦于实际开发中的挑战与解决方案。 性能分析与调优: 性能瓶颈识别: 介绍各种性能分析工具(如gprof, perf, VTune Amplifier, Nsight Systems, nvprof),讲解如何通过CPU/GPU性能计数器、事件探查(Profiling)、跟踪(Tracing)来识别代码中的性能瓶颈,例如CPU计算受限、内存带宽受限、通信开销过大、同步开销过高、IO瓶颈等。 并行算法设计: 强调选择或设计适合并行计算的算法的重要性。讲解不同问题(如矩阵乘法、傅里叶变换、数值积分、图算法)的并行化思路,以及如何平衡计算负载和通信开销。 数据布局与访问优化: 深入探讨如何通过优化数据结构(如行优先 vs 列优先存储)、内存对齐、缓存感知(Cache-aware)和缓存透明(Cache-oblivious)设计来提升数据访问效率。 并发与同步优化: 分析不同同步机制的开销,介绍避免不必要的锁、使用原子操作、减少线程同步点等技术,以及如何处理竞争条件和死锁。 GPU特有优化: 详细讲解GPU内存合并、共享内存的有效使用、线程束(Warp)同步、动态并行(Dynamic Parallelism)等GPU特有优化技巧。 并行程序的调试与验证: 并行调试器: 介绍专门用于并行程序的调试工具,如TotalView, DDT(Debugging Tool for MPI),以及如何在多进程、多线程环境下进行断点设置、变量查看、程序控制。 结果验证: 强调并行程序结果的正确性是首要的。讨论如何通过与串行版本对比、使用测试集、进行量级分析等方法来验证并行计算的准确性。 高性能计算的应用领域: 科学计算: 涵盖物理(流体力学、粒子物理)、化学(分子动力学、量子化学)、生物(基因组学、蛋白质折叠)、地球科学(天气预报、地震模拟)等领域的典型HPC应用。 工程仿真: 涉及有限元分析(FEA)、计算流体力学(CFD)、计算电磁学(CEM)、结构动力学等工程领域的数值模拟。 数据科学与机器学习: 讲解HPC在处理大规模数据集、训练深度学习模型、进行模式识别和数据挖掘中的作用。 金融建模: 探讨HPC在量化交易、风险管理、期权定价等金融领域的应用。 现代HPC工作流与开发流程: 作业调度系统(Batch Schedulers): 介绍PBS Pro, Slurm, LSF等常见的HPC作业调度系统,理解任务提交、资源申请、作业排队、依赖管理等流程。 容器化技术(Docker, Singularity): 探讨如何利用容器技术来管理HPC环境的依赖性,打包和部署应用程序,保证结果的可复现性。 版本控制与持续集成/持续部署(CI/CD): 强调在HPC项目中使用Git等版本控制系统,以及构建CI/CD流水线来自动化测试和部署,提高开发效率和代码质量。 第四部分:面向未来的趋势与挑战 高性能计算领域正以前所未有的速度发展,本部分将展望未来的技术趋势和面临的挑战。 AI与HPC的融合: 深入分析AI技术如何赋能HPC(如AI辅助的代码优化、AI模型加速),以及HPC如何支持大规模AI模型的训练和推理。 新兴硬件架构: 探讨下一代计算技术,如新型内存技术(持久性内存)、存内计算(In-memory Computing)、光学计算、量子计算的潜在影响。 能效比(Power Efficiency): 随着计算规模的增长,能源消耗成为HPC的重要考量。分析如何设计低功耗硬件和软件,以实现更高的能效比。 可扩展性与复杂性管理: 随着系统规模的不断扩大,如何设计和管理具有PB级甚至EB级数据的超大规模系统,以及如何应对日益增长的软件复杂性,将是持续的挑战。 人才培养与社区合作: 强调HPC领域对复合型人才的需求,以及开放科学、开源社区在推动HPC技术发展中的重要作用。 本书通过理论讲解、模型分析、工具介绍和实践指导,旨在帮助读者建立起扎实的HPC知识体系,掌握并行编程的核心技术,并能够灵活运用各种工具和方法来解决实际的计算难题。无论读者是科研人员、工程师,还是对高性能计算充满兴趣的学生,本书都将是一份宝贵的参考资料,助其踏上高性能计算的探索之路。

用户评价

评分

我最近翻阅了一本关于《多核与GPU编程:工具、方法及实践》的书,这本书的整体风格非常务实,而且内容深度也相当不错。作为一名一直对并行计算感兴趣,但又苦于缺乏系统指导的开发者来说,这本书就像给我指明了方向。它并没有一开始就抛出复杂的概念,而是循序渐进地引导读者进入多核和GPU编程的世界。 书中对并行编程的“方法”的阐述,是我觉得最宝贵的部分。它不仅介绍了各种常用的并行编程模型,更重要的是,它深入剖析了这些模型的设计理念、优缺点以及适用范围。我特别喜欢书中关于“数据并行”和“任务并行”的讨论,这让我对如何分解问题,将计算任务有效地分配到不同的处理单元有了更清晰的认识。此外,书中关于“性能优化”的章节,也给我留下了深刻的印象。作者详细讲解了如何识别性能瓶颈,如何进行代码优化,以及如何利用各种分析工具来评估程序的性能。书中提供的具体案例分析,让我能够直观地理解这些优化技巧的实际效果。我之前对某些性能问题一直很困惑,看完书中的分析,感觉豁然开朗。

评分

最近刚入手一本叫做《多核与GPU编程:工具、方法及实践》的书,本来对这类技术书籍总是抱持着一种“能学到一点是一点”的心态,没想到这本书给我带来了巨大的惊喜。它不像我之前看过的很多编程书籍那样,充斥着枯燥的理论公式或者晦涩的算法描述。这本书的语言非常流畅,而且充满了实际的例子和场景。作者似乎非常了解读者在实际开发中会遇到哪些困惑,并且有针对性地给出了解决方案。 我特别喜欢书中关于“工具”和“实践”的部分。它不仅仅是教你如何写代码,更重要的是告诉你如何选择合适的工具,以及如何在真实的项目中应用这些技术。比如,在介绍调试并行程序时,书中列举了多种常用的调试器和性能分析工具,并提供了详细的使用指南和注意事项。我之前在处理一些复杂的并行bug时,总是抓耳挠腮,效率低下,看完这部分内容后,我感觉自己仿佛掌握了“神器”。而且,书中提到的许多实践案例,都是非常贴近实际工作场景的,比如图像处理、科学计算等领域的优化方案,让我能够立刻联想到自己正在进行的开发任务,并从中获得灵感。这种“学以致用”的感觉,是其他很多书籍无法给予的。

评分

最近接触到一本名为《多核与GPU编程:工具、方法及实践》的书,不得不说,这本书的视角非常独特。它不像市面上很多同类书籍那样,仅仅停留在技术细节的堆砌,而是从一种更加宏观和战略性的角度来审视多核与GPU编程。作者似乎非常注重开发者在实际工作中所面临的挑战,并且试图提供一种更具指导意义的解决方案。 我尤其欣赏书中对于“实践”部分的着墨。它并没有止步于理论的讲解,而是提供了大量真实世界的案例研究,并对这些案例进行了深入的分析。我从中学习到了如何在不同的应用场景下,选择最合适的并行化策略,以及如何有效地管理和协调大量的并行线程。书中关于“内存管理”和“同步机制”的讲解,也极具参考价值,这对于避免常见的并行编程错误,提高程序的稳定性和效率至关重要。我之前在开发过程中,经常因为对这些细节处理不当而导致一些难以捉摸的bug。这本书就像一本“武功秘籍”,让我掌握了许多“内功心法”,能够从根源上解决问题。

评分

读《多核与GPU编程:工具、方法及实践》这本书,我真是感受良多。作为一名在高性能计算领域摸爬滚打多年的工程师,我一直以来都在寻找能够真正指导我如何高效利用现代硬件并行能力的实践性书籍。这本书恰恰填补了我的一个重要空白。它并没有像许多理论书籍那样,仅仅罗列各种并行模型和算法,而是深入浅出地讲解了多核CPU和GPU在架构上的差异,以及如何根据这些差异来设计和优化并行程序。 尤其令我印象深刻的是,书中对各种常用编程模型的介绍,比如OpenMP、MPI、CUDA和OpenCL。作者并没有停留在API的讲解,而是花了大量篇幅去阐述这些模型背后的设计哲学和适用场景。例如,在讨论OpenMP时,书中非常细致地分析了其基于共享内存模型的特点,以及如何通过私有化、同步等机制来处理数据竞争。而在介绍CUDA时,则清晰地描绘了其基于SIMT(Single Instruction, Multiple Threads)的模型,并结合大量实例展示了如何充分利用GPU的并行计算能力。我尤其喜欢书中关于内存层次结构和缓存一致性问题的讨论,这对于写出高性能并行代码至关重要。很多时候,性能瓶颈并非源于计算本身,而是隐藏在内存访问的效率低下上。书中提供的调优技巧和案例分析,让我茅塞顿开,找到了不少之前难以解决的性能问题。

评分

读完《多核与GPU编程:工具、方法及实践》这本书,我的第一感受是它非常“接地气”。我是一个偏向于实际应用型开发者,对于那些过于抽象的理论知识,总是有点消化不良。这本书则完全不同,它从一开始就将我带入了实际编程的场景中,让我能够立刻感受到并行编程的魅力和挑战。 我最喜欢的部分是书中关于“工具”的介绍。作者花了很多篇幅去讲解各种常用的并行编程工具,比如编译器选项、调试器、性能分析器等等。这些工具在实际开发中扮演着至关重要的角色,而很多时候,我们只是知道它们的存在,却不了解如何有效地使用它们。这本书则详细地介绍了这些工具的使用方法和技巧,并且提供了大量的实例,让我能够快速上手。我尤其喜欢书中关于“性能剖析”的章节,让我能够看到程序在运行时的具体表现,从而找到性能瓶颈,并进行针对性的优化。此外,书中关于“跨平台开发”和“移植性”的讨论,也为我提供了很多宝贵的经验。

相关图书

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 book.idnshop.cc All Rights Reserved. 静思书屋 版权所有