2016-10-03 100 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

相關問題