CUDA 知识点:线程束内同步函数 __syncwarp() | CUDA

当所涉及的线程都在一个线程束内时,可以使用开销更小的线程束内同步函数 __syncwarp()。该函数的原型为:

1
void __syncwarp(unsigned mask = 0xfffffff);

该函数有个可选的参数,该参数是一个代表掩码的无符号整型数,默认值的全部 32 个二进制位都为 1,代表线程束中的所有线程都参与同步。如果要排除一些线程,可以用一个对应的二进制位为 0 的掩码参数。例如,掩码 0xffffffe 代表排除第 0 号线程。

参考

《CUDA 编程:基础与实践》(樊哲勇,清华大学出版社)

CUDA 知识点:线程束洗牌函数 | CUDA

CUDA 中的线程束内基本函数包括:

  • 线程束表决函数(warp vote functions)
  • 线程束匹配函数(warp match functions)
  • 线程束洗牌函数(warp shuffle functions)
  • 线程束矩阵函数(warp matrix functions)

其中,线程束匹配函数和线程束矩阵函数都只能在 Volta 及更高架构的 GPU 中使用。本文主要介绍线程束洗牌函数。

阅读更多

CUDA 知识点:为什么锁页内存会更快? | CUDA

CUDA 驱动程序通过检查内存范围判断某个地址是锁页内存还是分页内存。锁页内存存储在物理内存中,因此 device 可以在没有 CPU 帮助的情况下获取它(通过DMA)。分页内存在通过 DMA 访问时会产生缺页中断,并且它有可能在磁盘上。在这种情况下,device 需要访问分页内存的每一页,将其拷贝到锁页内存缓冲区,然后再将其通过 DMA 一页页拷贝到 device 上。所以,使用锁页内存更快是因为省掉了从分页内存拷贝到锁页内存的时间。

参考:Why is CUDA pinned memory so fast?