C++高性能并行编程与优化 - 课件 - 12 从计算机组成原理看 C 语言指针uintptr_t:自动随系统位数决定大小 • 刚刚说过,计算机的位数决定了内存地址的大小。 - 而指针的本质就是内存地址,所以指针的大小在 32 位系统上就 32 位,64 位系统上就 64 位。 • 稍后我们再来详细讲解一下指针,有时候我们需要把指针的地址值存在整型变量里。 • 而 32 位平台上的指针是 32 位,64 位平台上的指针是 64 位。 所以是不是需要根据当前平台来判断要使用哪一种代码了? - 不需要,可以用自动随系统位数变化的 \text{sizeof}(\text{void}^{*}) = \text{sizeof}(\text{uintptr\_t})$ ## size_t :表示大小的整数类型,其实等价于 uintptr_t • 除了指针需要随系统位数变化之外,数组的长度也是需要随系统位数变化的。 • 如果 64 位系统上 size_t 还是 uint32_t,那就无法表示超过 4GB 大小的数组了。 - 今日乳 ja 笑话:java 序。 ## int 类型对应的指针类型:int* - 指针,顾名思义,就是“指向”一个内存中的变量。 - 语法规定:任何类型 T 所对应的指针类型是 T*。 - 可以通过 & 运算符获取一个变量的指针(地址)。 - 可以通过 * 运算符访问指针指向的变量(左值)。 - 因此指针指向了变量,通过指针的 * 运算符写入的值,会造成原变量 x = 1 指针的用法。 $$ \begin{array}{r}0 码力 | 128 页 | 2.95 MB | 2 年前3
Back to Basics: Pointers0 码力 | 152 页 | 5.61 MB | 1 年前3
The Zig Programming Language 0.4.0 Documentation0 码力 | 207 页 | 5.29 MB | 2 年前3
C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化电脑的缓存结构分为三级。 - 一级缓存分为数据缓存和指令缓存,其中数据缓存有32 KB,6 个物理核心每个都有一个,总共 192 KB。而指令缓存的大小刚好和数据缓存一样也是 192 KB。 - 二级缓存有 256 KB,6 个物理核心每个都有一个,总共 1.5 MB。 • 三级缓存由各个物理核心共享,总共 12 MB。  ## 根据我们缓存的大小分析刚刚的图表 - 也可以看到刚刚两个出现转折的点,也是在二级缓存和三级缓存的大小附近。 因此,数据小到装的进二级缓存,则最大带宽就取决于二级缓存的带宽。稍微大一点则只能装到三级缓存,就取决于三级缓存的带宽。三级缓存也装不下,那就取决于主内存的带宽了。 - 结论:要避免 mem-bound,数据量尽量足够小,如果能装的进缓存就高效了。 现象称为失效(invalid)。如果那个条目是被标记为脏的,则说明是当时打算写入的数据,那就需要向主内存发送写入请求,等他写入成功,才能安全移除这个条目。 - 如有多级缓存,则一级缓存失效后会丢给二级缓存。 ## 连续访问与跨步访问 - 如果访问数组时,按一定的间距跨步访问,则效率如何? • 从 1 到 16 都是一样快的,32 开始才按 2 的倍率变慢,为什么? - 因为 CPU 和内存0 码力 | 147 页 | 18.88 MB | 2 年前3
C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理} ## 将多个逻辑上相关的变量包装成一个类 ## C++ 思想:封装 比如要表达一个数组,需要:起始地址指针 v,数组大小 n 因此 C++ 的 vector 将他俩打包起来,避免程序员犯错 0.cpp #include#include int main() Pig(),他会调用每个成员的无参构造函数。 但是请注意,这些类型不会被初始化为 0: 1. int, float, double 等基础类型 2. void *, Object * 等指针类型 3. 完全由这些类型组成的类 - 这些类型被称为 POD(plain-old-data)。 • POD 的存在是出于兼容性和性能的考虑。 ## name: weight: 878706000 com/isocpp/CppCoreGuidelines ## 三五 法则:拷贝构造函数 • 在 = 时,默认是会拷贝的。比如右边这样: 但是这样对我们当前 Vector 的实现造成一个很大的问题。其 m_data 指针是按地址值浅拷贝的,而不深拷贝其指向的数组! - 这就是说,在退出 main 函数作用域的时候,v1.m_data 会被释放两次!更危险的则是 v1 被解构而 v2 仍在被使用的情况。 - 这就 0 码力 | 96 页 | 16.28 MB | 2 年前3
The Zig Programming Language 0.1.1 Documentation0 码力 | 82 页 | 2.67 MB | 2 年前3
micrograd++: A 500 line C++ Machine Learning Library0 码力 | 3 页 | 1.73 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程ebda53c2593beaa/p40_1.jpg) ## 试图解决:通过指针传递 - 那你可能会想,既然不能返回,那作为指针传入局部变量的引用,不就好了。 - 这样,在 cudaDeviceSynchronize() 以后,应该可以获取数据了吧? - 结果令人失望,尽管给 kernel 传了指向 ret 的指针,但 ret 的值并没有被改写成功。  ## 反之亦然,CPU 即可,释放时也是通过cudaFree。这样分配出来的地址,不论在CPU还是GPU上都是一模一样的,都可以访问。而且拷贝也会自动按需进行(当从CPU访问时),无需手动调用cudaMemcpy,大大方便了编程人员,特别是含有指针的一些数据结构。  ## 注意不要混淆0 码力 | 142 页 | 13.52 MB | 2 年前3
C++ Under the Hood0 码力 | 168 页 | 13.55 MB | 1 年前3
Back to Basics: Lambda Expressions0 码力 | 48 页 | 175.89 KB | 1 年前3
共 454 条
- 1
- 2
- 3
- 4
- 5
- 6
- 46













