2013-05-19 53 views
0

我已經寫了一個字符串匹配測試的程序,來測試性能與cpu。塊中的一個線程和一個warp(32個線程)有什麼區別?

我只是調用由<<<1,1>>>內核,它包含一個線程,執行時間爲430ms,然後我用一個街區兩個線程<<<1,2>>>調用內核的一個塊,執行時間爲303ms,最後我調用內核通過<<<2,1><<,兩個塊和一個線程,時間只是430ms(即215ms)的一半。

塊中的線程和warp有什麼區別?是什麼讓一個包含兩個線程的塊比兩個塊慢一個線程?

回答

5

要做的第一點是GPU需要數百或數千個活動線程來隱藏固有的高延遲體系結構並充分利用可用的算術容量和內存帶寬。使用一個或兩個塊中的一個或兩個線程對代碼進行基準測試是完全浪費時間的。

第二點是沒有「線程在塊中」這樣的事情。線程基本上在32個線程的變形中執行。塊由1個或更多的經紗和1個或更多塊的網格組成。

當您使用一個線程啓動包含單個塊的網格時,將啓動1個warp。這個warp包含31個「虛擬」線程被屏蔽掉,並且有一個活動線程。如果使用兩個線程啓動單個塊,則仍會啓動1個warp,但現在單個warp包含2個活動線程。

當您啓動兩個包含單個線程的塊時,它將導致兩個warp,每個warp包含一個活動線程。由於所有調度和執行都是在每個warp的基礎上完成的,因此您現在有兩個單獨的實體(warps),硬件可以獨立調度和執行。這允許更多的延遲隱藏和更少的指令流水線停頓,並且代碼運行得更快。

因此,TLDR的答案是1塊= 1變形,2塊= 2變形,後者不像前者那樣次優。

相關問題