C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化benchmark::DoNotOptimize(a); } } BENCHMARK(BM_random); ## 解决:按 64 字节分块地随机访问 - 解决方法就是,把数据按 64 字节大小分块。随机访问时,只随机块的位置,而块的内部仍然按顺序访问。 |Benchmark|Time|CPU|Iterations| |---|---|---|---| |BM\_ordered|31636481 |BM\_random\_4B|661031176 ns|654128483 ns|1| |BM\_random\_64B|90700966 ns|90362737 ns|8| 可以看到 64 字节分块的效果拔群,但还是比顺序访问慢一些,为什么?明明没有浪费带宽了? void BM_random_4B(benchmark::State &bm) { for (auto _: bm) 续、跨步)能被识别出来,而如果你的访存是随机的,那就没办法预测。遇到这种突如其来的访存时,CPU 不得不空转等待数据的抵达才能继续工作,浪费了时间。 ## 解决:按更大的分块(4096 字节)随机访问 - 解决方案就是,把分块的大小调的更大一些,比如 4KB 那么大,即 64 个缓存行,而不是一个。 - 这样一次随机访问之后会伴随着 64 次顺序访问,能被 CPU 检测到,从而启动缓存行预取,避免了等待数据抵达前空转浪费时间。0 码力 | 147 页 | 18.88 MB | 2 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程这是因为 GPU 上的线程是并行执行的,然而 sum[0] += arr[i] 这个操作,实际上被拆分成四步: • 读取 sum[0] 到寄存器 A - 读取 arr[i] 到寄存器 B • 让寄存器 A 的值加上寄存器 B 的值 • 写回寄存器 A 到 sum[0] • 这样有什么问题呢? _global__ void parallel_sum(int *sum, int const sum[0] 到寄存器 A(A=0) • 线程 1:读取 sum[0] 到寄存器 A(A=0) • 线程 0:读取 arr[0] 到寄存器 B(B=arr[0]) • 线程 1:读取 arr[1] 到寄存器 B(B=arr[1]) • 线程 0:让寄存器 A 加上寄存器 B(A=arr[0]) • 线程 1:让寄存器 A 加上寄存器 B(A=arr[1]) • 线程 0:写回寄存器 A 到 sum sum $$ 0 $$ (sum $$ 0 $$ =arr $$ 0 $$ ) • 线程 1:写回寄存器 A 到 sum $$ 0 $$ (sum $$ 0 $$ =arr $$ 1 $$ ) - 这样一来最后 sum[0] 的值是 arr[1]。而不是我们期望的 arr[0] + arr[1],即算出来的总和变少了! __global__ void parallel_sum(int *sum0 码力 | 142 页 | 13.52 MB | 2 年前3
PyConChina2022-杭州-ARM芯片的Python+AI算力优化-朱宏林[Image](/uploads/documents/7/e/7/0/7e7069c0246e16402e9a8fd670f8e842/p7_4.jpg) ## GEMM ## • 优化 GEMM • 内存布局:矩阵分块;重排 • 向量化指令:AVX、NEON C  ## GEMM 例子 ## • 优化 GEMM • 内存布局:矩阵分块;重排 • 向量化指令:AVX、NEON for (int j = 0; j < N; j++) { for (int i = 0; i < M; i++) { vc -> C(i, j), C(i + 1, j), C(i + 2, j), C(i + 3, j) } } ## GEMM 例子 ## • 优化 GEMM • 内存布局:矩阵分块;重 • 向量化指令:AVX、NEO 0 码力 | 24 页 | 4.00 MB | 2 年前3
Linux命令大全搜索工具 v1.8dpkg-split(选项)(参数) ## 选项 1. -S:设置分割后的每个小文件最大尺寸(以字节为单位); 2. -s:分割软件包; 3. -j<分块文件><分块文件>:把各个分块合并到一起; 4. -I<分块文件>:显示分块文件的相关信息; 5. -l:列出不匹配的部分; 6. -dscard<文件名>:忽略不匹配的部分。 ## 参数 软件包:指定需要分割的“ set\_wolset\_msglevel|从网卡寄存器中获得网卡速度等信息,可配置。| |-a -A|get\_pauseparamset\_pauseparam|从网卡寄存器中获得Autonegotiate/RX/TX模块的状态:on or off,可配置。| |-c -C|get\_coalesceset\_coalesce|从网卡寄存器中获得coalescing参数:TX/RX一个数据包 set\_ringparam|除当前TX/RX ring的值(从网卡寄存器中读取得到,可配置)外,其它为网卡bnx2自己固定的信息。| |-k -K|get\_rx\_csumget\_tx\_csumget\_sg get\_tso set\_rx\_csumset\_tx\_csum set\_sg set\_tso|显示信息从保存该状态的变量中读取得到,没有对应的寄存器。因此,TX/RX校验等模块一直处于on状态,实际上是无法修改的。|0 码力 | 1347 页 | 8.79 MB | 2 年前3
jsc::chunk_evenly Range Adaptor for Distributing Work Across Tasks0 码力 | 1 页 | 1.38 MB | 1 年前3
Adventures in SIMD Thinking (Part 2 of 2)0 码力 | 135 页 | 551.08 KB | 1 年前3
RISC-V 手册 v2(一本开源指令集的指南). 21 第二章 RV32I: RISC-V 基础整数指令集 ..... 23 2.1 导言 ..... 23 2.2 RV32I 指令格式 ..... 23 2.3 RV32I 寄存器 ..... 26 2.4 RV32I 整数计算 ..... 27 2.5 RV32I 的 Load 和 Store ..... 29 2.6 RV32I 条件分支 ..... 30 4.2 结束语.....53 4.3 扩展阅读.....53 第五章 RV32F 和 RV32D:单精度和双精度浮点数.....55 5.1 导言.....55 5.2 浮点寄存器.....55 5.3 浮点加载,存储和算术指令.....56 5.4 浮点转换和搬运.....60 5.5 其他浮点指令.....60 5.6 使用 DAXPY 程序比较 RV32FD,ARM-32,MIPS-32 7.3 结束语.....71 7.4 扩展阅读.....71 第八章 向量.....75 8.1 导言.....75 8.2 向量计算指令.....76 8.3 向量寄存器和动态类型.....76 8.4 向量的 Load 和 Store 操作.....78 8.5 向量操作期间的并行性.....78 8.6 向量运算的条件执行.....79 8.7 其他向量指令0 码力 | 164 页 | 8.85 MB | 2 年前3
RISC-V 开放架构设计之道 1.0.0colspan="5">基础数据参考值: RV32X和RV641 RISC-V 基础整数指令集(RV32I/64I),特权指令,和可选的RV32/64C。寄存器x1-x31和PC在RV32I中是32位,在RV64I中是64位(x0=0)。RV64I添加了用于处理更宽数据的12条指令。每条16位RVC指令都映射到已有的32位RISC-V指令。 开源 RISC-V 故FADD. $ \{F|D\} $ 表示FADD.F和FADD.D。RV32 $ \{F|D\} $ 添加了f0-f31寄存器,其位宽和最大精度匹配,还添加了一个浮点控制状态寄存器fcsr。RV32V添加了向量寄存器v0-v31,向量谓词寄存器vp0-vp7,和向量长度寄存器v1。RV64添加了若干指令:RVM5条,RVA11条,RVF4条,RVD6条,RVV0条。 Powered by TCPDF 架构的全貌,帮助读者深入了解 RISC-V 架构的核心原理和特点。首先,本书介绍了 RISC-V 的基本概念和设计原则,让读者对 RISC-V 有一个整体的认识。接着,本书深入讲解了 RISC-V 的指令集、寄存器、内存管理、异常处理等方面的内容,帮助读者理解和应用 RISC-V 的各项功能和特性。此外,本书还提供了丰富的图表和示例,帮助读者更好地理解 RISC-V。无论是对计算机科学领域的专业人士、学生还是0 码力 | 223 页 | 15.31 MB | 2 年前3
简明 X86 汇编语言教程 2010-03-10第2次补充 2010-03-25第3次补充 目录 第0章写在前面.....2 第一章汇编语言简介.....3 第二章认识处理器.....4 2.1寄存器.....4 2.2使用寄存器.....6 第三章操作内存.....12 3.1实模式.....12 3.2保护模式.....16 3.3操作内存.....19 3.4串操作.....21 4.2中断.....31 第五章编译优化概述.....34 5.1循环优化:强度削减和代码外提.....36 5.2局部优化:表达式预计算和子表达式提取.....37 5.3全局寄存器优化.....38 5.4x86体系结构上的并行最大化和指令封包.....40 5.5存储优化.....42 第六章Linux X86汇编程序设计.....46 6.1编译和链接.. 数据传输指令.....47 二、算术运算指令.....49 三、逻辑运算指令.....49 四、串指令.....50 五、程序转移指令.....50 六、伪指令.....52 七、寄存器.....52 八、位操作指令,处理器控制指令.....52 九、FPU instructions.....54 第八章GCC内联汇编基础.....54 1.GCC汇编格式.....550 码力 | 63 页 | 598.28 KB | 2 年前3
C++高性能并行编程与优化 - 课件 - 04 从汇编角度看编译器优化x64 架构下的寄存器模型  ## 通用寄存器:32 位时代 • 32 位 x86 架构中的通用寄存器有: • eax, ecx, edx, ebx, esi, edi, esp, ebp - 其中 esp 是堆栈指针寄存器,和函数的调用与返回相关。 其中 eax 是用于保存返回值的寄存器。 ## 通用寄存器:64 位时代 • 64 位 x86 架构中的通用寄存器有: • rax, rcx, rdx, rbx, rsi, rdi, rsp, rbp, r8, r9, r10, r11, ..., r15 - 其中 r8 到 r15 是 64 位 x86 新增的寄存器,给了汇编程序员更大的空间,降低了编译器处理寄存器翻车(register spill)的压力。 dy> ## AT&T 汇编语言 ## GCC 编译器所生成的汇编语言就属于这种 |项目|AT&T|Intel|说明| |---|---|---|---| |寄存器命名|%eax|eax|Intel的不带%| |操作数顺序|movl %eax, %edx|mov edx,eax|将eax的值赋值给edx| |常数\\立即数|movl $3,%eaxmovl $0x100 码力 | 108 页 | 9.47 MB | 2 年前3
共 123 条
- 1
- 2
- 3
- 4
- 5
- 6
- 13













