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