 C++高性能并行编程与优化 -  课件 - 03 现代 C++ 进阶:模板元编程variant :判断当前是哪个类型用 v.index() • 除了这个之外,还可以用成员方法 index() 获取当前是参数列表中的第几个类型。这 样也可以实现判断。 variant :批量匹配 std::visit • 如果你的 if-else 每个分支长得都差不多(除了 std::get<> 的类型不一样以外),可以考虑用 std::visit ,他会自动用相应的类型,调用你的 名著不看红楼梦,后面我忘了,总 之就是只能度过一个相对失败的人 生 :) std::visit :还支持多个参数 • 其实还可以有多个 variant 作为参数。 • 相应地 lambda 的参数数量要与之匹配。 • std::visit 会自动罗列出所有的排列组合! • 所以如果 variant 有 n 个类型,那 lambda 就要被编译 n² 次,编译可能会 变慢。 • 但是标准库能保证运行时是0 码力 | 82 页 | 12.15 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 03 现代 C++ 进阶:模板元编程variant :判断当前是哪个类型用 v.index() • 除了这个之外,还可以用成员方法 index() 获取当前是参数列表中的第几个类型。这 样也可以实现判断。 variant :批量匹配 std::visit • 如果你的 if-else 每个分支长得都差不多(除了 std::get<> 的类型不一样以外),可以考虑用 std::visit ,他会自动用相应的类型,调用你的 名著不看红楼梦,后面我忘了,总 之就是只能度过一个相对失败的人 生 :) std::visit :还支持多个参数 • 其实还可以有多个 variant 作为参数。 • 相应地 lambda 的参数数量要与之匹配。 • std::visit 会自动罗列出所有的排列组合! • 所以如果 variant 有 n 个类型,那 lambda 就要被编译 n² 次,编译可能会 变慢。 • 但是标准库能保证运行时是0 码力 | 82 页 | 12.15 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 16 现代 CMake 模块化项目管理指南src/*.cpp) • 疑问 1 :都是按照通配符批量匹配文件,有什么区别? • GLOB : src/main.cpp (√) src/test/main.cpp ( × ) • GLOB_RECURSE : src/main.cpp (√) src/test/main.cpp (√) • 区别在于 GLOB_RECURSE 允许 * 匹配嵌套的目录。 • 疑问 2 :加了 CONFIGURE_DEPENDS0 码力 | 56 页 | 6.87 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 16 现代 CMake 模块化项目管理指南src/*.cpp) • 疑问 1 :都是按照通配符批量匹配文件,有什么区别? • GLOB : src/main.cpp (√) src/test/main.cpp ( × ) • GLOB_RECURSE : src/main.cpp (√) src/test/main.cpp (√) • 区别在于 GLOB_RECURSE 允许 * 匹配嵌套的目录。 • 疑问 2 :加了 CONFIGURE_DEPENDS0 码力 | 56 页 | 6.87 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 07 深入浅出访存优化uint64_t address; • char data[64]; • }; • CacheEntry cache[512]; • 当 CPU 读取一个地址时: • 缓存会查找和该地址匹配的条目。如果找到,则给 CPU 返 回缓存中的数据。如果找不到,则向主内存发送请求,等读 取到该地址的数据,就创建一个新条目。 • 在 x86 架构中每个条目的存储 64 字节的数据,这个条目 uint64_t address; • char data[64]; • }; • CacheEntry cache[512]; • 当 CPU 写入一个地址时: • 缓存会查找和该地址匹配的条目。如果找到,则修改缓存 中该地址的数据。如果找不到,则创建一个新条目来存储 CPU 写的数据,并标记为脏( dirty )。 • 当读和写创建的新条目过多,缓存快要塞不下时,他会把 最0 码力 | 147 页 | 18.88 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 07 深入浅出访存优化uint64_t address; • char data[64]; • }; • CacheEntry cache[512]; • 当 CPU 读取一个地址时: • 缓存会查找和该地址匹配的条目。如果找到,则给 CPU 返 回缓存中的数据。如果找不到,则向主内存发送请求,等读 取到该地址的数据,就创建一个新条目。 • 在 x86 架构中每个条目的存储 64 字节的数据,这个条目 uint64_t address; • char data[64]; • }; • CacheEntry cache[512]; • 当 CPU 写入一个地址时: • 缓存会查找和该地址匹配的条目。如果找到,则修改缓存 中该地址的数据。如果找不到,则创建一个新条目来存储 CPU 写的数据,并标记为脏( dirty )。 • 当读和写创建的新条目过多,缓存快要塞不下时,他会把 最0 码力 | 147 页 | 18.88 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 08 CUDA 开启的 GPU 编程blockDim ),都能自动根据给定的 n 区间循环,不会越界,也不会漏掉几个元 素。 • 这样一个 for 循环非常符合 CPU 上常见 的 parallel for 的习惯,又能自动匹配不同 的 blockDim ,看起来非常方便。 从线程到板块 • 核函数内部,用之前说到的 blockDim.x + blockIdx.x + threadIdx.x 来获取线程在整个 网格中编号。 ),总共多少板块( gridDim )。 都能自动根据给定的 n 区间循环,不会越界 ,也不会漏掉几个元素。 • 这样一个 for 循环非常符合 CPU 上常见的 parallel for 的习惯,又能自动匹配不同的 blockDim 和 gridDim ,看起来非常方便。 本方法出自英伟达官方博客: https://developer.nvidia.com/blog/cuda-pro-tip-wr0 码力 | 142 页 | 13.52 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 08 CUDA 开启的 GPU 编程blockDim ),都能自动根据给定的 n 区间循环,不会越界,也不会漏掉几个元 素。 • 这样一个 for 循环非常符合 CPU 上常见 的 parallel for 的习惯,又能自动匹配不同 的 blockDim ,看起来非常方便。 从线程到板块 • 核函数内部,用之前说到的 blockDim.x + blockIdx.x + threadIdx.x 来获取线程在整个 网格中编号。 ),总共多少板块( gridDim )。 都能自动根据给定的 n 区间循环,不会越界 ,也不会漏掉几个元素。 • 这样一个 for 循环非常符合 CPU 上常见的 parallel for 的习惯,又能自动匹配不同的 blockDim 和 gridDim ,看起来非常方便。 本方法出自英伟达官方博客: https://developer.nvidia.com/blog/cuda-pro-tip-wr0 码力 | 142 页 | 13.52 MB | 1 年前3
 新一代分布式高性能图数据库的构建 - 沈游人实时图结构预览 • 用户授权管理 • 中文及显示别名支持 图模型设计 WebUI—— 可视化图探索分析 【亮点】 • K 步邻居查询、属性过滤 • 最短路径、全路径分析 • 按实体、边类型匹配查询 • 子图识别、环路识别等在 线图挖掘分析 • 实体、边可视化统计分析 • 树、层次、分组等多种布 局方式 • 基于 D3 自研的万级别实 体展现 可视化图探索分析 AtlasGraph0 码力 | 38 页 | 24.68 MB | 1 年前3 新一代分布式高性能图数据库的构建 - 沈游人实时图结构预览 • 用户授权管理 • 中文及显示别名支持 图模型设计 WebUI—— 可视化图探索分析 【亮点】 • K 步邻居查询、属性过滤 • 最短路径、全路径分析 • 按实体、边类型匹配查询 • 子图识别、环路识别等在 线图挖掘分析 • 实体、边可视化统计分析 • 树、层次、分组等多种布 局方式 • 基于 D3 自研的万级别实 体展现 可视化图探索分析 AtlasGraph0 码力 | 38 页 | 24.68 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 02 现代 C++ 入门:RAII 内存管理Pig(pig) 语法 来强制拷贝。 为什么很多面向对象语言,比如 Java ,都没有构造函数全家桶这些概念? • 因为他们的业务需求大多是:打开数据库,增删改查学生数据,打开一个窗口,写入一个 文件,正则匹配是不是电邮地址,应答 HTTP 请求等。 • 这些业务往往都是在和资源打交道,从而基本都是刚刚说的要删除拷贝函数的那一类,解 决这种需求,几乎总是在用 shared_ptr C++高性能并行编程与优化 -  课件 - 02 现代 C++ 入门:RAII 内存管理Pig(pig) 语法 来强制拷贝。 为什么很多面向对象语言,比如 Java ,都没有构造函数全家桶这些概念? • 因为他们的业务需求大多是:打开数据库,增删改查学生数据,打开一个窗口,写入一个 文件,正则匹配是不是电邮地址,应答 HTTP 请求等。 • 这些业务往往都是在和资源打交道,从而基本都是刚刚说的要删除拷贝函数的那一类,解 决这种需求,几乎总是在用 shared_ptr- 的模式,于是 0 码力 | 96 页 | 16.28 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 12 从计算机组成原理看 C 语言指针其实不知道他的参数是什 么类型,他只看到你字符串里写的 “ %f” ,会误以 为输入的是 float 参数。 • 如果你输入的是 3 这样的 int 类型常量, C 语 言不会帮你检测到他和 “ %f” 其实是不匹配的,而 是直接把 int 类型的 4 个字节推到栈上作为 printf 的参数,而 printf 却会把这 4 个字节作为 浮点来处理。由于浮点的指数位处于高位,但整数 是 3 ,导致高位全是0 码力 | 128 页 | 2.95 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 12 从计算机组成原理看 C 语言指针其实不知道他的参数是什 么类型,他只看到你字符串里写的 “ %f” ,会误以 为输入的是 float 参数。 • 如果你输入的是 3 这样的 int 类型常量, C 语 言不会帮你检测到他和 “ %f” 其实是不匹配的,而 是直接把 int 类型的 4 个字节推到栈上作为 printf 的参数,而 printf 却会把这 4 个字节作为 浮点来处理。由于浮点的指数位处于高位,但整数 是 3 ,导致高位全是0 码力 | 128 页 | 2.95 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 15 C++ 系列课:字符与字符串Windows 在中国发售时,就会默认采用 GB18030 格式,所以有时候你会发现 Windows 上编辑好的文件,拿到 Linux (往往是 UTF-8 )的电脑上打开会变成乱码。就是 因为编码格式不匹配的原因。 • 但如果你 Windows 上写日记,只写 ASCII 字符,那么拿到 Linux 就不会有任何问题。因 为 UTF-8 和 GBK 这两个编码格式是兼容 ASCII 的,他保证 0x00~0x7F0 码力 | 162 页 | 40.20 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 15 C++ 系列课:字符与字符串Windows 在中国发售时,就会默认采用 GB18030 格式,所以有时候你会发现 Windows 上编辑好的文件,拿到 Linux (往往是 UTF-8 )的电脑上打开会变成乱码。就是 因为编码格式不匹配的原因。 • 但如果你 Windows 上写日记,只写 ASCII 字符,那么拿到 Linux 就不会有任何问题。因 为 UTF-8 和 GBK 这两个编码格式是兼容 ASCII 的,他保证 0x00~0x7F0 码力 | 162 页 | 40.20 MB | 1 年前3
共 8 条
- 1













