CUDA编程指南 4.1节说明:
[...]设备完全占用的时钟周期数 执行线程,[不同于]时钟周期数 设备实际上花了执行线程指令。前号 大于后者[...]
据我所知,第一个是完成线程执行的挂钟时间。第二次是第一次减去线程空闲的时间。当线程的指令需要等待先前指令(指令依赖性)的结果,或等待内存中的操作数值或在同步点等待时,线程将处于空闲状态。
然后指南继续说:
前者的数量大于后者,因为线程是时间 切片。
在此上下文中时间切片的含义是什么?说线程是时间切片是什么意思?
请注意,此术语不会出现在指南中的任何其他位置。 (请原谅我,如果我在这里缺少明显的背景,我不是母语为英语的人。)
答案 0 :(得分:1)
此上下文中的时间切片指的是多个warp在多处理器(SM)上运行的事实,并且SM在warp之间切换,因为执行继续以隐藏延迟。这与传统CPU线程中的抢占不同;也不像流水线一样。
如果你有这样的代码:
if (threadIdx.x == 0 && blockIdx.x == 0) x = clock();
// other work done by all threads
if (threadIdx.x == 0 && blockIdx.x == 0) y = clock();
如果SM上运行了多个warp,则y-x
的值将大于在线程0中执行的实际时间(== warp 0)。这不仅仅是因为线程0必须等待指令或内存访问的结果,这也是由于执行其他warp所花费的时间。
编程指南中的这一陈述的要点是使用clock()进行绝对定时或延迟测量是很棘手的。
答案 1 :(得分:0)
当多个线程正在运行并且它们必须共享一个处理单元时,通常处理的方式是每个线程都有一个固定的最大运行时间段(你的时间片),然后它被抢占,另一个线程获得跑了一段时间。因此,如果您的线程无法在一个时间片内完成其工作,那么它可能必须等到它再次轮到它。这需要多长时间取决于并行线程的数量,它们正在做什么,如何实现调度程序以及哪些处理资源可用。
答案 2 :(得分:-1)