C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程
,从而实现一个函数针对 GPU 和 CPU 生成两份源码级不同的 代码。 __CUDA_ARCH__ 是个版本号 • 其实 __CUDA_ARCH__ 是一个整数,表 示当前编译所针对的 GPU 的架构版本号 是多少。这里是 520 表示版本号是 5.2.0 ,最后一位始终是 0 不用管,我们 通常简称他的版本号为 52 就行了。 • 这个版本号是编译时指定的版本,不是运 行时检测到的版本。编译器默认就是最老 com/cuda/cuda-compiler-driver-nvcc/index.html#extended-notation 针对不同的架构,使用不同的代码 通过 CMake 设置架构版本号 • 可以用 CMAKE_CUDA_ARCHITECTURES 这个变量 ,设置要针对哪个架构生成 GPU 指令码。 • 小彭老师的显卡是 RTX2080 ,他的版本号是 75 ,因 此最适合他用的指令码版本是 75 • 不过英伟达的架构版本都是向前兼容的,即版本号为 75 的 RTX2080 也可以运行版本号为 52 的指令码,虽然 不够优化,但是至少能用。也就是要求:编译期指定的 版本 ≤ 运行时显卡的版本。 CMAKE_CUDA_ARCHITECTURES 会自动转换成 --gpu-code 等编 译 flag 版本号不要太新了 • 比如这里设置了 RTX3000 系列的架构版 本号 860 码力 | 142 页 | 13.52 MB | 1 年前3《深入浅出MFC》2/e
体版之授权,直接等3/e 出版后再动作。没想到一拖经年,我的3/e 写作计划 并没有如期完成,致使大陆读者反而没有《深入浅出MFC》2/e 简体版可看。 《深入浅出MFC》3/e 没有如期完成的原因是,MFC 本体架构并没有什么大改 变。《深入浅出MFC》2/e 书中所论之工具及程序代码虽采用VC5+MFC42,仍 适用于目前的VC6+MFC421(唯,工具之画面或功能可能有些微变化)。 由于《深入浅出MFC》2/e 就会吸收很快。 请问,想要从DOS 跨足到Windows 程序设计有哪些书值得推荐呢? hschin.bbs@bbs.cs.nthu.edu.tw:建议你看侯俊杰的深入浅出MFC,里面除了对窗口程序 的架构作基础性的说明,让你了解一些基础概论,也说了不少窗口程序设计的课题,是 非常不错的一本书。 xiii News / BBS 论坛(CompBook and/or programming) 请问VISUAL 您好,我是屏科大的学生,想要用MFC 写一个可以新增、修改、删除资料等动作的 程序,日前老师借了我您的书深入浅出MFC 第二版,我读了很快乐,对于Visual C++ 的 IDE 环境更为了解,对于MFC 整个架构,有了比较明朗的感觉。 大陆Mike Dong尊敬的侯俊杰先生:我叫董旬。我对C/C++ 非常有兴趣。畅读了您写的书《深入浅出 WINDOWS 0 码力 | 1009 页 | 11.08 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 12 从计算机组成原理看 C 语言指针
64 位。 • 实际上地址的高 16 位始终和第 48 位一致(符号扩展),也就是虚拟地址空间只有 48 位。 • 而经过 MMU 映射后实际给内存的地址只有 39 位,因此如今的 x64 架构实际上只能访 问 512GB 内存,如果插了超过这个大小的内存条他也不会认出来。 • 此外, 16 位计算机实际上能通过额外的段寄存器访问到 20 位的内存地址( 1MB )。 • 32 位计算机还能通过 位 32 位 32 位 long long 64 位 64 位 64 位 64 位 注意到 Unix 和 Windows 关于 long 的定义有分歧: Unix 认为 long 的大小应该和系统架构位数一样, 32 位系统上就 32 位, 64 位系统上就 64 位。 Windows 认为 long 不论 32 位系统还是 64 位系统都一样应该为 32 位,认为这样安全。 因此我们在编写 C 证的。 • 为了解决不同操作系统上对类型定义混乱的问题, C 语言标准引入了 stdint.h 这个头文件 。 • 他里面包含一系列类型别名 (typedef) ,这些别名保证不论是什么操作系统什么架构,都是 固定的大小,例如: • typedef char int8_t; • typedef short int16_t; • typedef int int32_t; • typedef0 码力 | 128 页 | 2.95 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 04 从汇编角度看编译器优化
章:汇编语言 x64 架构下的寄存器模型 通用寄存器: 32 位时代 • 32 位 x86 架构中的通用寄存器有: • eax, ecx, edx, ebx, esi, edi, esp, ebp • 其中 esp 是堆栈指针寄存器,和函数的调用与返回相关。 • 其中 eax 是用于保存返回值的寄存器。 通用寄存器: 64 位时代 • 64 位 x86 架构中的通用寄存器有: •0 码力 | 108 页 | 9.47 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 16 现代 CMake 模块化项目管理指南
Windows 平台默认为 C:/Program Files 。 •是你在 find_package( REQUIRED) 命令中指定的包名。 • 是系统的架构名。 https://zhuanlan.zhihu.com/p/60479441 Unix 类系统下的搜索路径 • /(lib/ |lib*|share)/cmake/ */ ${CMAKE_PREFIX_PATH} , Unix 平台默认为 /usr 。 • 是你在 find_package( REQUIRED) 命令中指定的包名。 • 是系统的架构,例如 x86_64-linux-gnu 或 i386-linux-gnu 。 • (用于伺候 Ubuntu 喜欢把库文件套娃在 /usr/lib/x86_64-linux-gnu 目录下) https://zhuanlan 0 码力 | 56 页 | 6.87 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化
CPU 读取一个地址时: • 缓存会查找和该地址匹配的条目。如果找到,则给 CPU 返 回缓存中的数据。如果找不到,则向主内存发送请求,等读 取到该地址的数据,就创建一个新条目。 • 在 x86 架构中每个条目的存储 64 字节的数据,这个条目 又称之为缓存行( cacheline )。 • 当访问 0x0048~0x0050 这 4 个字节时,实际会导致 0x0040~0x0080 的 可以分配对齐 到任意 a 字节的内存。他在这个头文件里。是 x86 特有的,并且需要通 过 _mm_free 来释放。 • 还有一个跨平台版本(比如用于 arm 架构) 的 aligned_alloc(align, n) ,他也可以分配对 齐到任意 a 字节的内存,通过 free 释放。 • 利用他们可以实现分配对齐到页面( 4KB ) 的内存。 小彭老师的 0 码力 | 147 页 | 18.88 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串
位整数即可,可以是有符号也可以 是无符号,任凭编译器决定( C 标准委员会传统异能, khronos 直呼内行) 。 • 以 GCC 为例,他规定 char 在 x86 架构是有符号的 (char = signed char) ,而在 arm 架构上则认为是无符号的 (char = unsigned char) ,因为他 认为“ arm 的指令集处理无符号 8 位整数更高效”,所以擅自把 char 魔改成无0 码力 | 162 页 | 40.20 MB | 1 年前3现代C++ 教程:高速上手C++11/14/17/20
<< std::endl; return 0; } 当然,并非所有的类型都能提供原子操作,这是因为原子操作的可行性取决于具体的 CPU 架构, 69 7.5 原子操作与内存模型 第 7 章并行与并发 以及所实例化的类型结构是否能够满足该 CPU 架构对内存对齐条件的要求,因而我们总是可以通过 std::atomic::is_lock_free 来检查该原子类型是否需支持原子操作,例如: 0 码力 | 83 页 | 2.42 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 性能优化之无分支编程 Branchless Programming
这就是,无分支优化。 • setle 指令是单独一条指令,不需要跳转。 比起需要跳转的 jle 指令,他避免了 CPU 预测分支和预测失败带来的额外开销。 条件跳转指令 vs 无分支指令 • x86 指令集架构中,条件跳转指令有 j 开头的一系列,无分支指令有 set 系列和 cmov 系列。 • jle .L1 上一次比较结果为小于等于时,程序跳转到 .L1 处,否则不跳转继续往下执行。 • setle0 码力 | 47 页 | 8.45 MB | 1 年前3
共 9 条
- 1