Concurrency 你能为CUDA中的一个内核分配特定数量的内核吗?

Concurrency 你能为CUDA中的一个内核分配特定数量的内核吗?,concurrency,cuda,collision-detection,Concurrency,Cuda,Collision Detection,我有一个Nvidia GeForce GTX 1080,带有20个流式多处理器。我想使用CUDA移植一个碰撞检测系统,该系统在代码中有多个分支,具体取决于碰撞对象的类型。例如:检查球体和圆柱体是否发生碰撞的代码与检查球体和另一球体之间碰撞的代码不同。为了提高性能和减少代码差异,我考虑在单独的内核中并行运行这些分支,因为我的设备支持并发内核执行。在这种情况下,有没有办法为每个内核分配特定数量的CUDA内核 我试图在CUDA开发者指南页面和堆栈溢出页面上找到如何做到这一点,但未能找到一种方法来定制将

我有一个Nvidia GeForce GTX 1080,带有20个流式多处理器。我想使用CUDA移植一个碰撞检测系统,该系统在代码中有多个分支,具体取决于碰撞对象的类型。例如:检查球体和圆柱体是否发生碰撞的代码与检查球体和另一球体之间碰撞的代码不同。为了提高性能和减少代码差异,我考虑在单独的内核中并行运行这些分支,因为我的设备支持并发内核执行。在这种情况下,有没有办法为每个内核分配特定数量的CUDA内核

我试图在CUDA开发者指南页面和堆栈溢出页面上找到如何做到这一点,但未能找到一种方法来定制将哪些内核分配给哪些内核


希望曾经尝试过类似方法的人能给我指引方向。提前谢谢你

首先,您不能直接将串行codepu代码映射为GPU codeplallel代码。您需要理解基本概念,并将问题映射到并行体系结构。在尝试将代码移植到GPU之前,我建议您首先学习并行编程和CUDA基础知识。否则,您可能会获得比CPU代码更低的性能。对于对象冲突和其他常见的并行问题,您可以阅读以下优秀的在线书籍:

但是,对于您的问题,您可以通过将边界四舍五入到扭曲大小,在单个内核中运行不同的分支。当不同的扭曲之间有不同的执行路径时,将不会出现分歧。Cuda会自动并行这些扭曲。你不必担心他们使用哪种SM。下面的代码没有分歧

int idx= threadIdx.x + blockIdx.x * blockDim.x;
if (idx < offset[0]) {  //offset[0] is multiple of 32
    // task number 0
}
else if (idx < offset[1]) { //offset[1] is multiple of 32
    // task number 1
}
else if (idx < offset[2]) { //offset[2] is multiple of 32
    // task number 2
}
...

不,你不能……非常感谢你提供的信息!非常感谢,你提供的答案似乎正是我想要的!所以基本上,如果我理解正确,我可以使用这些代理if条件来确保我的部分代码在不同的扭曲上运行并且同步执行,对吗?你可以,但我仍然认为在开始尝试和错误之前,你需要学习一点cuda。如果您不学习Cuda和GPGPU编程,可能会遇到很多问题,并且没有获得任何性能。