假设我有Nvidia K40,并且由于某种原因,我希望我的代码仅使用Cuda核心的一部分(即不使用全部2880仅使用400个核心作为示例),是否可能?这样做是否合乎逻辑要么? 另外,有什么方法可以看到我运行代码时GPU正在使用多少个内核?换句话说,我们可以在执行期间检查代码使用了多少个核心,报告喜欢"任务管理器"在Windows中还是Linux中的顶级?
答案 0 :(得分:2)
这是可能的,但这种概念在某种程度上违背了cuda的基本最佳实践。不是说它对某些事情没有用处。例如,如果您想在同一GPU上运行多个内核,并且出于某种原因想要为每个内核分配一定数量的流式多处理器。也许这对于没有完美内存访问模式的内核的L1缓存可能是有益的(我仍然认为99%的情况下手动共享内存方法会更好)。
如何执行此操作,将访问ptx标识符%nsmid和%smid,并对原始启动内核进行条件设置。每个Streaming Multiprocessor(SM)只需要1个块,然后根据你想要哪个内核返回每个内核。
我会警告说,这种方法应该留给非常有经验的cuda程序员,并且只作为性能的最后手段。另外,正如我的评论中所提到的,我记得读过一个线程块可以从一个SM迁移到另一个SM,因此必须在实现之前测量行为,并且可能依赖于硬件和cuda版本。但是,既然你问过,因为我相信它是可能的(尽管不推荐),这里有一些资源可以实现你提到的。
PTS注册SM索引和SM数量...... http://docs.nvidia.com/cuda/parallel-thread-execution/#identifiers
如何在没有直接编写ptx的情况下在cuda内核中使用它... https://gist.github.com/allanmac/4751080