C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化* * * * 重新认识 SOA * * * * 结构体的内存布局: AOS 与 SOA • AOS ( Array of Struct )单个对象的属性紧挨着存 • xyzxyzxyzxyz • SOA ( Struct of Array )属性分离存储在多个数组 ,因此比 AOS 快了 2 倍。 AOSOA :两者得兼 • 还有一种办法就是让 MyClass 内部是 SOA ,而外部仍是一个 vector的 AOS—— 这种内存布局称为 AOSOA 。 • 缺点是必须保证数量是 1024 的整数倍, 而且因为要两次指标索引,随机访问比较 烦。 • 这里的 1024 并非随意选取,而是要让每 个属性 SOA 数组的大小为一个页 stream 指令, 这样就可以和标准库优化过的 memset 一 样快了。 Intel Intrinsics Guide • _mm 系列指令出自 头文件。 • 指令的文档可以看这个网站: • https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html • 里面有详细说明每个指令 0 码力 | 147 页 | 18.88 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 04 从汇编角度看编译器优化错了,有可能不仅不变快,反而还变慢! SIMD 和缓存行对齐只是性能优 化的一个点,又不是全部。还要考虑结构体变大会导致内存带宽的占用, 对缓存的占用等一系列连锁反应,总之,要根据实际情况选择优化方案。 结构体的内存布局: AOS 与 SOA • AOS ( Array of Struct )单个对象的属性紧挨着存 • xyzxyzxyzxyz • SOA ( Struct of Array )属性分离存储在多个数组0 码力 | 108 页 | 9.47 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理• 求一个列表中所有数的和: # 参考资料 - [ 热心观众整理的学习资料 ](https://github.com/jiayaozhang/OpenVDB_and_TBB) - [C++ 官方文档 ](https://en.cppreference.com/w/) - [C++ 核心开发规范 ](https://github.com/isocpp/CppCoreGuidelines/blob bookstack.cn/read/CMake-Cookbook/README.md) - [CMake 官方文档 ](https://cmake.org/cmake/help/latest/) - [Git 官方文档 ](https://git-scm.com/doc) - [GitHub 官方文档 ](https://docs.github.com/en) 古代: C 语言 近代: C++98 引入0 码力 | 96 页 | 16.28 MB | 1 年前3
现代C++ 教程:高速上手C++11/14/17/20. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 第 8 章文件系统 75 8.1 文档与链接 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 8 server.start(); } 参考答案见此。 进一步阅读的参考资料 1. 知乎『如何评价 GCC 的 C++11 正则表达式?』中原库作者 Tim Shen 的回答 2. 正则表达式库文档 62 第 7 章并行与并发 第 7 章并行与并发 7.1 并行基础 std::thread 用于创建一个执行的线程实例,所以它是一切并发编程的基础,使用时需要包含头文件,它提供了很多基本的线程操作,例如 std::cout << f.get() << std::endl; 2. 请使用 std::atomic 实现一个互斥锁。 进一步阅读的参考资料 • C++ 并发编程 (中文版) • 线程支持库文档 • Herlihy, M. P., & Wing, J. M. (1990). Linearizability: a correctness condition for concur- rent 0 码力 | 83 页 | 2.42 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串,则默认 是 C 语言的 0 结尾字符串, find 还要去求 len = strlen(“str”) , 相对低效。 find 寻找子字符串 find 应用案例:计算子字符串出现了多少次 官方文档对 find 的描述 https://en.cppreference.com/w/cpp/string/basic_string/find 反向查找 rfind • find 是从字符串头部开始查找,返回第一次出现的地方。 char *s, size_t slen); replace 批量替换字符串 不是最高效的写法,最坏情况可达 O(mn) ,其中 m 是 “ pyb” 出现次数,如何优化?留作课后作业! 官方文档对 replace 的描述 https://en.cppreference.com/w/cpp/string/basic_string/replace 小彭老师表示: 边界情况总结 • s.substr(pos string &append(string_view sv); • size_t find(string_view sv, size_t pos) const noexcept; • 为什么我看官方文档上没写?标准库头文件里也没看到? • 其实是有的,只不过官方为了让头文件不依赖于 头 文件,把他们写成了模板,并利用类似 SFINAE 的机制给模板参数类型的设 0 码力 | 162 页 | 40.20 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 16 现代 CMake 模块化项目管理指南FindCURL.cmake 的注释,可以 看到 IMPORTED Targets 章节是在介绍现代 的用法,而 Result Variables 章节是在介绍 古代的用法,我们尽量用现代的那种就行。 官方文档: find_package 的两种模式 指定使用哪种模式 • find_package(TBB MODULE REQUIRED) • 只会寻找 FindTBB.cmake ,搜索路径: 1 ” ${XXX_INCLUDE_DIRS}) • 如果为空说明你变量名打错了, CMake 特色就是找不到变量不报错,而是视为空字符串。 • 去看一下 FindXXX.cmake 里的注释(那就是文档),到底是什么名字。 少见的 add_subdirectory 邪教 • 大部分第三方库都需要提前安装好,然后再 find_package 找到他,然后才能链接。 • 也有少数第三方库为了方便0 码力 | 56 页 | 6.87 MB | 1 年前3
面向亿行 C/C++ 代码的静态分析系统设计及实践-肖枭高危,误报率偏高的高价值检查器 搭配其他误报率低的检查器 避免重要问题被忽略的同时降低 “感知误报率” 降低感知误报率 方法3:易于理解的报告 关键步骤高亮和行为解释 配套完善的文档 代码交叉索引 降低感知误报率 回忆下代码评审 时最不能忍的事 是啥?对,就是 不能像在IDE里 面一样查看符号 定义使用。 代码交叉索引 方法4:Bug生命周期跟踪 精确查找类似Bug,利用0 码力 | 39 页 | 6.88 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 01 学 C++ 从 CMake 学起)能够自动查找所有依赖,并利用刚刚提 到的 PUBLIC PRIVATE 正确处理依赖项,比如如果你引用了 OpenVDB::openvdb 那么 TBB::tbb 也会被自动引用。 • 其他包的引用格式和文档参考: https://cmake.org/cmake/help/latest/module/FindBLAS.html 安装第三方库 - 包管理器 • Linux 可以用系统自带的包管理器(如0 码力 | 32 页 | 11.40 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 05 C++11 开始的多线程编程other 陷入等待 后 func 里的 unlock() 永远得不到调用。 解决 1 : other 里不要再上锁 • 遇到这种情况最好是把 other 里的 lock() 去掉,并在其文档中说明:“ other 不是线 程安全的,调用本函数之前需要保证某 mutex 已经上锁。” 解决 2 :改用 std::recursive_mutex • 如果实在不能改的话,可以用0 码力 | 79 页 | 14.11 MB | 1 年前3
《深入浅出MFC》2/e并无简体版,因此我时时收到大陆读者来信询问购 买繁体版之管道。一来我不知道是否台湾出版公司有提供海外邮购或电购,二 来即使有,想必带给大家很大的麻烦,三来两岸消费水平之差异带给大陆读者 的负担,亦令我深感不安。 1. 这个文档是从侯捷网站提供的繁体板简体化过来的。 2. 由于排版问题,有些繁体说法在换行时候没有被替换,所以遇到问题大家可以对照原文比较一下。 3. 附录、无责任书评那个文件没有转(估计看到那个地方的时候,你手里也该有一本纸板的了)。 Print Preview) 什么是打印预览?简单地说,把屏幕仿真为打印机,将图形输出于其上就是了。预览的 目的是为了让使用者在打印机输出之前,先检查他即将获得的成果,检查的重要项目包 括图案的布局以及分页是否合意。 为了完成预览功能,MFC 在CDC 之下设计了一个子类别,名为CPreviewDC。所有其 他的CDC 对象都拥有两个DC,它们通常井水不犯河水;然而CPreviewDC 就不同,0 码力 | 1009 页 | 11.08 MB | 1 年前3
共 14 条
- 1
- 2













