围绕 Robin Hood Hashing、探测距离和存储布局,拆解 ska::flat_hash_map 的实现思路。
从最小复现、指令集与 ABI 差异入手,定位旧版 GCC 环境中的 AVX2 崩溃问题。
名词说明 # CUDA. 一般来说指的是CUDA SDK. 目前经常使用的是CUDA 8.0和CUDA 10.1两个版本. 8.0和10.1都是SDK的版本号. CUDNN. The NVIDIA CUDA® Deep Neural Network library (cuDNN). 是一个可以为神经网络提供GPU加速的库 compute capability. 是GPU的固有参数,可以理解为GPU的版本.越新的显卡该数值往往越高. tensorRT.NVIDIA TensorRT™ is an SDK for high-performance deep learning inference. 是一个深度学习推理库,旨在提供高性能的推理速度. plan file,也称为 engine plan. 是生成的tensorRT 模型文件. 兼容性说明 # Engine plan 的兼容性依赖于GPU的compute capability 和 TensorRT 版本, 不依赖于CUDA和CUDNN版本.
Halide is a programming language designed to make it easier to write high-performance image and array processing code on modern machines.
halide有两个特性比较吸引人。一个是对于各种平台架构的支持。
CPU architectures: X86, ARM, MIPS, Hexagon, PowerPC Operating systems: Linux, Windows, macOS, Android, iOS, Qualcomm QuRT GPU Compute APIs: CUDA, OpenCL, OpenGL, OpenGL Compute Shaders, Apple Metal, Microsoft Direct X 12 另一个是把计算什么和怎么计算(何时计算)分离开来。
迫于生计,最近要学习halide
先去学习/复习一下常见的编译优化技巧。
loop unrolling,也就是循环展开,顾名思义,就是把循环展开来写。
1normal loop: 2int x; 3 for (x = 0; x < 100; x++) 4 { 5 delete(x); 6 } 7 8after loop unrolling: 9int x; 10 for (x = 0; x < 100; x += 5 ) 11 { 12 delete(x); 13 delete(x + 1); 14 delete(x + 2); 15 delete(x + 3); 16 delete(x + 4); 17 } 循环展开是一种优化,可以手动实现也可以编译器自动实现。
CUDA 编程涉及到在不同的平台上同时运行代码:包含 CPU 的 host 和包含 GPU 的 device。
所以了解 host 和 device 的差异对性能优化是非常重要的。
2.1. Differences between Host and Device # Threading resources # host 上能同时运行的线程数目比较少(比如 24 个)。
APOD指的是Assess, Parallelize, Optimize, Deploy
如图所示,APOD过程是一个循环的过程,每次只进行一部分,从A到P到O到D,然后再进行下一轮的APOD
Assess # 对于一个项目,第一步要做的是接触(Assess)项目,得到项目代码中每部分的执行时间。有了这部分内容,开发者就可以找到并行优化的瓶颈所在,并开始尝试用GPU加速。
可以了解成并行版的STL(?
过了一遍nvidia的官方网文档
发现如果熟悉STL的话,thrust没什么太多好说的,看起来很简单…
不过还是开一篇记录一下,一段时间内估计要和cuda c++ 打交道,就当记录使用过程中遇到的问题吧.
由于发现cuda c++ 的 debug方式和c++ 差别很大,因此打算再开一篇,专门记录一些和error checking 以及debug有关的内容.
Error checks in CUDA code can help catch CUDA errors at their source. There are 2 sources of errors in CUDA source code:
update:有毒吧,kernel 中出问题原来不会报错。
请教了组里的 hust 学长 orz..
学到了 cuda-memcheck 命令和 cudaGetLastError 来查看问题,可以参考What is the canonical way to check for errors using the CUDA runtime API?
先放一波资料。
An Even Easier Introduction to CUDA CUDA C/C++ Basics nvidia-thrust 官方文档 how-access-global-memory-efficiently-cuda-c-kernels efficient-matrix-transpose-cuda-cc 很强大的warp内shuffle cuda-GDB官方文档 cuda-c-best-practices-guide cuda 提出的目的是能够让程序员透明地使用GPU来高效地进行并行运算。