C++高性能并行编程与优化 - 课件 - 10 从稀疏数据结构到量化数据类型能不能再小一点:用 int8_t 表示 • 发现结果不对了……说明 int8_t 太小了(可以容纳 - 128 到 127 ),容纳不下 97*100 这么大的数,发生 了溢出导致结果错误。 试图解决:用 uint8_t 表示,定点数系数调小到 2 • 注意到我们的值始终是正数,因此可以用无符号的 uint8_t (可以容纳 0 到 255 ),然后把刚刚的系数 100 改小到 2 ,成功算对结果了,代价是精度损失了0 码力 | 102 页 | 9.50 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程join 很像)。所以,不可能从 kernel 里 通过返回值获取 GPU 数据,因为 kernel 返回 时核函数并没有真正在 GPU 上执行。所以核函 数返回类型必须是 void 。 试图解决:通过指针传递 • 那你可能会想,既然不能返回,那作为指 针传入局部变量的引用,不就好了。 • 这样,在 cudaDeviceSynchronize() 以后 ,应该可以获取数据了吧? •0 码力 | 142 页 | 13.52 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 17 由浅入深学习 map 容器。 • 例如:一个同学问小彭老师在干嘛? • 小彭老师说“我在吃答辩。”那么同学认为这个答辩指的是三体动画,小彭老师在看三体动画。 而不会认为小彭老师真的在吃答辩。 • 小彭老师说“我在拉答辩。”那么同学认为这个答辩指的是答辩(物理),小彭老师在上厕所。 而不会认为小彭老师在制作三体动画。 • 所以这位同学是人类思维,相当于 Python 的精分 API 。而如果另一个同学是硬核的计算 4, 2, 8, 5, 7 }; • std::find(a.begin(), a.end(), 5); • 这个 std::find 就是标准库帮我们实现的线性数组中查找元素的算法,让我们用动画演示一 下他的工作原理吧。 1 4 2 8 5 7 内存 地址 a a+1 a+2 a+3 a+4 a+5 vector 查找为什么低效 • 我们要找的数是 5 ,首先从数组第一个元素开始,判断第一个元素是否等于 1, 4, 2, 8, 5, 7 }; • a.find(5); • set 之所以能够实现 O(logn) 复杂度高效查找,是因为他内部预先构建好了一棵二叉排序树。 • 如何构建的?请看动画: 1 4 2 8 5 7 待插入的数 set 查找为什么高效 • set 又称集合(数学概念),是专为查找优化的容器,查找元素要用他自带的 find 函数。 • seta = { 0 码力 | 90 页 | 8.76 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化(a[i - 2] + a[i + 2]) * 0.25 + a[i] * 0.5 • 我们得到了求出两次迭代后状态的公式。这样 就可以在一个循环体内实现两次迭代的效果! 从而快了 2 倍。 动画演示 a a’ a’’ 局部数组,一步抵 16 步 • 一次性读取到局部数组 ta 里,在局部迭代 16 次。 • 注意到局部数组是 64 大小,这包含了中心的 32 个元 素,还包含因为0 码力 | 147 页 | 18.88 MB | 1 年前3
共 4 条
- 1













