在 CUDA PTX 中,有一个特殊寄存器,用于保存线程的扭曲索引:%warpid。现在,规范说:
请注意,它
%warpid是易失性的,并返回读取时线程的位置,但其值可能在执行期间发生变化,例如,由于抢占后线程的重新调度。
嗯,那是什么位置?它不应该是块内的位置,例如一维网格吗%tid.x / warpSize?它是 SM 中的一些扭曲槽(例如扭曲调度程序或一些内部队列)吗?我很困惑。
动机:我想%tid.x / warpSize通过使用这个特殊寄存器来省去计算的麻烦并释放寄存器。然而,回想起来,这是一个错误的动机,因为读取特殊寄存器的成本很高;请参阅:计算一维网格中的扭曲 id / 通道 id 的最有效方法是什么?
您需要阅读紧随您在问题中发布的引用之后的文档的接下来 25 个单词:
因此,如果内核代码中需要这样的值,则应使用 %ctaid 和 %tid 来计算虚拟扭曲索引;
进而
%warpid 主要用于启用分析和诊断代码来采样和记录信息,例如工作场所映射和负载分布。
所以不,你不能用它来达到你想要的目的。%warpid实际上是调度程序槽 ID,而不是块内恒定、唯一的扭曲索引。