我知道你通常应该在CUDA上每个块运行至少32个线程,因为线程是以32个为一组执行的.但是我想知道只有一个块有一堆线程被认为是可接受的做法(我知道那里是线程数的限制).我问这个是因为我有一些问题需要线程的共享内存和跨计算的每个元素的同步.我想像我一样启动我的内核
computeSomething<<< 1, 256 >>>(...)
并且只是使用线程来进行计算.
只有一个块有效,或者我只是在cpu上进行计算会更好吗?
如果你关心性能,这是一个坏主意.
主要原因是给定的线程块只能占用GPU上单个SM的资源.由于大多数GPU具有2个或更多SM,这意味着您将保持在未达到GPU性能的50%到90%之间.
对于性能,这两种内核配置都很糟糕:
kernel<<<1, N>>>(...);
Run Code Online (Sandbox Code Playgroud)
和
kernel<<<N, 1>>>(...);
Run Code Online (Sandbox Code Playgroud)
首先是你要问的情况.第二种是每个线程块一个线程的情况; 这使得大约97%的GPU马力不受影响.
除了上述考虑因素之外,GPU还具有延迟隐藏机器,并且可以使用大量线程,warp和线程块来选择工作,以隐藏延迟.拥有大量可用线程有助于GPU隐藏延迟,这通常会带来更高的效率(每单位时间完成的工作).
无法判断CPU是否会更快.你必须进行基准测试和比较.如果所有数据都已经在GPU上,并且你必须将它移回CPU来完成工作,然后将结果移回GPU,那么在相对使用GPU时可能仍然会更快低效的方式,以避免移动数据的开销.