簡體   English   中英

有關GPU(CUDA)上的並行性的問題

[英]Questions about parallelism on GPU (CUDA)

在問我的問題之前,我需要詳細說明自己在做什么。 我希望我的英語和我的解釋足夠清楚簡潔。

我目前正在對最初編寫的C代碼進行大規模並行化。 我對CUDA感興趣的原因是我正在處理的數組的大尺寸:代碼是流體力學的模擬,我需要啟動“時間循環”,對大小為3.10 ^的數組進行五到六個連續的操作^ 9或19.10 ^ 9雙變量。 我經歷了各種教程和文檔,最后終於寫出了一個不太糟糕的CUDA代碼。

在不檢查代碼細節的情況下,我使用了相對較小的2D塊。 線程數為18或57(這很尷尬,因為我的包裝未完全占據)。

內核稱為“大” 3D網格,它描述了我的物理幾何形狀(最大期望尺寸是每個尺寸1000個值,這意味着我想處理具有10億個塊的3D網格)。

好的,現在,我的5到6個工作正常的內核正在充分利用共享內存的優勢,因為每個內核的全局內存都是讀取盎司和寫入盎司(實際上,塊的大小是根據所需的足夠數量的共享內存)。

我的一些內核是並發啟動的,異步調用,但是其中大多數需要連續的。 從設備到主機有幾種memcpy,但是memcpys與內核調用的比率非常低。 我主要在對數組值執行操作。

這是我的問題:

如果我理解正確,那么我所有的塊都同時在陣列上完成工作。 因此,這意味着處理10塊網格,100塊網格或十億個網格將花費相同的時間? 答案顯然不是,因為當我處理大型網格時,計算時間顯得尤為重要。 這是為什么?

我使用的是相對適中的NVIDIA設備(NVS 5200M)。 在嘗試使用更大/更高效的設備之前,我試圖適應CUDA。

由於我自己經歷了所有優化和CUDA編程建議/指南,因此我可能完全誤解了一些要點。 我希望我的問題不要太天真...

謝謝!

If I understood correctly, all of my blocks are doing the job on the arrays at the same time.

不,他們不會同時運行! 可以同時運行多少個線程塊取決於幾件事,所有這些都影響到設備的計算能力cc2.1 5200M應該為cc2.1 啟用CUDA的GPU具有內部調度程序,該調度程序管理何時以及何時運行哪個線程塊以及這些塊的扭曲。 Where表示將在哪個流式多處理器(SM)上啟動該塊。

每個SM都有有限數量的資源-例如共享內存和寄存器。 這些限制的很好的概述提供了編程指南占用計算器 第一個限制是,對於cc2.1一個SM可以同時運行多達8個線程塊。 根據您對寄存器,共享內存的使用情況,該數目可能會減少。

如果我沒cc2.1cc2.1的SM存在96個cuda內核,因此您的NVS 5200M應該具有一個SM。 假設您的內核設置同時將N(N <= 8)個線程塊裝入SM。 內部調度程序將在前N個塊中啟動,並使所有其他線程塊排隊。 如果一個線程塊完成了工作,則將啟動隊列中的下一個線程塊。 因此,如果總共啟動1次直到N個塊,則內核使用的時間將非常相等。 如果使用N + 1個塊運行內核,則將增加使用時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM