2016-10-03 101 views
0

CUDA并行块每次从头到尾执行是否正常?我的意思是:CUDA线程按照它们开始的相同顺序执行

如果我有3个线程,我总是得到这样的:

•第一个线程结束。 •第二个线程完成。 •第三个线程完成。

我不知道这是否是一种正常行为,因为我是CUDA中的新成员。我知道Open MP,C++线程或Java线程通常每次都会给出不同的结果。但在CUDA中,我总是得到相同的订单。那可能吗?或者那意味着有些东西不能很好地工作?

回答

1

CUDA对此行为不提供任何保证。由于32个线程被分组为warp,因此您可能会观察到那里的典型或可重复行为,但是如果启动3百万个线程,则会看到从运行到运行的顺序不同。

+0

那么我实际上有10个线程,并已运行它们约100次,总是得到相同的结果。从1到10.这是否仍然可以发生时,一切工作正常? :) – user3111627

+0

是的。 Warps是以锁步方式执行的32个线程组(可能需要阅读我在答案中提供的文档的warp链接)。所以他们的行为可能更具可预测性。如果启动64个线程,您甚至可能看不到多少差异。但是如果你启动300万个线程,你将会看到行为上的差异。 –

0

如果这些线程是在相同的经纱,它们将在所述顺序由硬件,这是非常有可能为0〜31

如果那些线程在不同的经纱但在相同确定的锁步执行线程块,由warp调度程序确定的顺序将是不可预知的。

如果那些线程在不同的线程块中,块调度器确定的顺序将是不可预知的。

+0

是否有可能以某种方式检查线程是否在同一个warp中?我测试了它,并且可以保证它们位于同一个数字为0的块中。我还想知道是否可以强制线程在不同的块中执行,以便我可以得到一个随机的命令? – user3111627

+0

@ user3111627对于第一个问题,满足(线程ID%32)的线程是相同的warp。对于第二个问题,当您启动内核时,只需使块号超过1,每个块只包含1个线程。这样,你可以得到一个随机的订单。如果你很好地理解warp,blocks和multiprocessors的概念,你可以清楚地说明。 – BugRepairMan

+0

你确实需要理解warps/block/SM的概念。在给定块中的线程被分组为32个线程的“warps”(到目前为止它总是32;可能在将来会改变),它以锁步方式执行,即它们都执行指令0,然后是1,然后是2等。你其实没有其他的保证;特别是,我认为对于一个街区内的经线顺序没有任何保证。 – leo

相关问题