单内核启动中的CUDA块执行顺序

单内核启动中的CUDA块执行顺序,cuda,Cuda,我总共启动了256个线程。当我通过启动一个块来完成时,一切都很好。但当我以2x2块(每个块有8x8个线程)启动线程时,内核无限循环。好吧,真正的问题是,我的内核代码等待来自其他块的部分结果,在运行了几个测试之后,我观察到这些块是以随机顺序启动的,它们似乎是按顺序执行的 如果CUDA块是从同一个内核启动的,它们会并行运行吗?我使用的GPU不是一个限制,因为我只启动256个线程,GTX580可以处理它们。(在16x16线程的单块启动中,一切正常) 有什么方法可以知道执行顺序或指定它吗?是的,块并行运

我总共启动了256个线程。当我通过启动一个块来完成时,一切都很好。但当我以2x2块(每个块有8x8个线程)启动线程时,内核无限循环。好吧,真正的问题是,我的内核代码等待来自其他块的部分结果,在运行了几个测试之后,我观察到这些块是以随机顺序启动的,它们似乎是按顺序执行的

如果CUDA块是从同一个内核启动的,它们会并行运行吗?我使用的GPU不是一个限制,因为我只启动256个线程,GTX580可以处理它们。(在16x16线程的单块启动中,一切正常)
有什么方法可以知道执行顺序或指定它吗?

是的,块并行运行。并行运行的块数取决于GPU的性能,但重要的是块的启动顺序是未定义的不可定义的。阅读更多信息-第2.2章,最后三段。

是的,块并行运行。并行运行的块数取决于GPU的性能,但重要的是块的启动顺序是未定义的不可定义的。阅读更多内容-第2.2章,最后三段。

链接到源代码会更好,但在我的例子中,它们不是并行运行的。块仅在其他块完成执行后运行。我必须启用并行执行吗?只要它们是平行的,随机顺序对我来说是可以的。@tecfreak:我不完全明白你想问什么。所以进一步解释:只要GPU有空闲资源(没有完全占用流式多处理器(SM))在某些SM上拾取并启动一个未执行的块,并将驻留在该块中,直到该块中的所有线程都完成为止。@tecfreak块仅在SM有足够的资源容纳该块时才分配给SM执行。如果你的区块总数超过了所有SMs的总和,那么很明显,一些区块必须等待其他区块完成才能分配给SM。好吧,我明白了,没有足够的可用资源。我想我必须改变我的编码方式以减少相互依赖性。链接到源代码会更好,但在我的情况下,它们不是并行运行的。块仅在其他块完成执行后运行。我必须启用并行执行吗?只要它们是平行的,随机顺序对我来说是可以的。@tecfreak:我不完全明白你想问什么。所以进一步解释:只要GPU有空闲资源(没有完全占用流式多处理器(SM))在某些SM上拾取并启动一个未执行的块,并将驻留在该块中,直到该块中的所有线程都完成为止。@tecfreak块仅在SM有足够的资源容纳该块时才分配给SM执行。如果你的区块总数超过了所有SMs的总和,那么很明显,一些区块必须等待其他区块完成才能分配给SM。好吧,我明白了,没有足够的可用资源。我想我必须改变编码方式以减少相互依赖性。由于总共只有4个块的网格,没有理由所有4个块不会在GTX 580中的4个不同SMs上或多或少同时执行。你没有给出关于你的代码的真实细节,也没有描述你是如何“观察到这些块……似乎是按顺序执行的”。目前GPU无法预先知道块的执行顺序或指定块的执行顺序。由于总共只有4个块的网格,在GTX 580中的4个不同SMs上,没有理由所有4个块不开始或多或少同时执行。您没有给出关于代码的真实细节,也没有描述如何“观察到块……似乎是按顺序执行的”。此时GPU无法先验地知道块的执行顺序或指定块的执行顺序。