↓ 跳过正文
  1. Posts/

CUDA C Best Practices Guide 阅读笔记(二) Heterogeneous Computing

·880 字·2 分钟

CUDA 编程涉及到在不同的平台上同时运行代码:包含 CPU 的 host 和包含 GPU 的 device。

所以了解 host 和 device 的差异对性能优化是非常重要的。

2.1. Differences between Host and Device
#

Threading resources
#

host 上能同时运行的线程数目比较少(比如 24 个)。

device 上能同时运行的线程数目比较多(数量级通常为 1E3、1E4 等)。

Threads
#

操作系统必须让线程在 CPU 执行通道上进进出出,以提供多线程能力。因此,上下文切换(交换两个线程时)既慢又昂贵。

相比之下,GPU 上的线程非常轻量级。在典型的系统中,成千上万的线程排队等待工作(每个 warp 有 32 个线程)。如果 GPU 必须等待一个 warp 的线程,它只需开始在另一个线程上执行工作。

简而言之,CPU 内核被设计为每次最小化一个或两个线程的等待时间,而 GPU 被设计为处理大量并发的轻量级线程以最大化吞吐量。

RAM
#

host 和 device 各自具有独立的附接物理存储器。host 内存和 device 内存由 PCI Express(PCIe)总线分隔,因此 host 内存中的项目必须偶尔通过总线传送到 device 内存,反之亦然。

2.2. What Runs on a CUDA-Enabled Device?
#

下面谈谈应该把应用的哪些部分放在 device 上运行。

  • 大数据集上的算术运算。
  • 为了获得最佳性能,设备上运行的相邻线程的内存访问应该具有一定的一致性。**某些内存访问模式使硬件能够将多个数据项的读或写组合并到一个操作中。**当在 CUDA 上的计算中使用时,无法布局以实现合并的数据,或者没有足够的局部性来有效地使用 L1 或纹理缓存的数据,将倾向于看到较小的加速比。
  • host 和 device 之间的数据交换尽可能少:
    • 换到 device 上执行的数据一定要被做足够多的运算,不然数据从 host 传送到 device 的代价可能与该运算在 device 上并行计算的优势相抵消,甚至得不偿失。
    • **数据应尽可能长时间保存在设备上。**因为传输应该最小化,所以在同一数据上运行多个内核的程序应该倾向于在内核调用之间将数据保留在设备上,而不是将中间结果传输到主机,然后再将它们发送回设备进行后续计算。就是说,如果有一段连续的操作要处理某些数据,就算其中的部分操作在 host 上运行要比在 device 上快(比如不是算术运算而是逻辑处理),那么考虑到数据传输的巨大代价,将所有数据都放在 device 上处理可能会更好。这种处理原则即使对相对较慢的内核也可能是有利的,如果它避免了一个或多个 PCIe 传输。

相关文章

cuda error checking 学习笔记

·283 字·1 分钟
由于发现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:

CUDA C Best Practices Guide 阅读笔记(1) 并行计算方法论(APOD)

·759 字·2 分钟
APOD指的是Assess, Parallelize, Optimize, Deploy 如图所示,APOD过程是一个循环的过程,每次只进行一部分,从A到P到O到D,然后再进行下一轮的APOD Assess # 对于一个项目,第一步要做的是接触(Assess)项目,得到项目代码中每部分的执行时间。有了这部分内容,开发者就可以找到并行优化的瓶颈所在,并开始尝试用GPU加速。

cuda 学习笔记

·2297 字·5 分钟
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来高效地进行并行运算。

qt 5.x 初探 (5) 

·166 字·1 分钟
qt_5.9_ui_doc 还是比直接写代码方便点。。。所以不妨学习一个! 以及。。。qt在2017年6月1号发布了5.9。。。所以之前是5.8。。。现在变成5.9了。。。 遇到了修改了ui文件却没有生效的问题。。。