我正在测试CUDA占用设备,故意我尝试了一个拥有一个线程的块。电子表格给了我
Active Threads per Multiprocessor:32
Active Warps per Multiprocessor:1
我理解为什么warps
的数量为1,但预计每threads
的有效SM
数为1。这是否意味着,将生成一个warp,其中31个结果将不会被提交。我怀疑是这样,但想确认一下。
干杯
答案 0 :(得分:2)
今天GPU的基本调度单位是 warp ,而不是线程。因此,无论您是仅指定一个线程还是全部32个线程,都会以相同的方式将warp用于调度目的。
在这种情况下,我会说“Active Threads”指的是与Active Warps相关联的所有线程。其中一些线程可能无法执行任何操作,具体取决于您的块配置和/或实际线程代码,但是这些线程仍然涉及计划的warp。
是的,如果你想只运行一个线程,它需要一个完整的warp。
这就是为什么网格配置在任一位置都有1的原因之一:
my_kernel<<<N, 1>>>();
或
my_kernel<<<1,N>>>();
在使用GPU资源方面效率低下。
答案 1 :(得分:0)
我创建了一个简单的测试程序,其中我声明了32个字长的数组。内核代码很简单d_a [tid] = 2 * [d_tid];我只在线程上启动内核。在显示结果时,我得到d_a [0]只能正确缩放...访问我的数组的其他元素显示错误。这告诉我确实安排了一个warp但它只有一个线程活动而不是32因此我的问题和我的困惑