簡體   English   中英

NVIDA GPU上cuda Kernel的峰值吞吐量

[英]The peak throughput of cuda Kernel on NVIDA GPU

我對GPU上運行的內核的吞吐量有疑問。 假設其占用率為0.5,塊大小為256:編程指南指出最好有多個塊,以便它們可以隱藏內存延遲等。但我不明白為什么這是正確的。 因為只要內核每個流多處理器有多個warp = 24,即3個塊,它就會達到峰值吞吐量。 因此,具有超過24個warp(或3個塊)將不會改變吞吐量。

我錯過了什么嗎? 任何人都能糾正我嗎?

雖然低占用率的SM確實無法充分隱藏延遲,但重要的是要理解這一點:

更高的占用率!=更高的吞吐量!

占用率只是衡量SM在任何特定時刻可供選擇的工作量的指標。 具有更多駐留扭曲使SM更有能力執行有用的工作,而其他warp正在等待結果(內存訪問的結果或計算 - 都具有非零延遲)。

吞吐量是每秒完成工作量的量度,雖然它可能受到延遲(因此占用率)的限制,但它也可能受到內存帶寬,指令吞吐量(執行單元數量)和其他因素的限制。

編程指南說明擁有多個線程塊而不僅僅是一個大線程塊更好的原因是因為有時能夠不僅從其他warp而且從其他塊發出工作更好。 這是一個例子:

想象一下,你的大線程塊必須從全局內存加載數據(高延遲)並將其存儲到共享內存(低延遲),然后必須立即執行__syncthreads() 在這種情況下,當warp完成加載其數據並將其寫入共享內存時,它必須等待,直到塊中的所有其他線程完成相同操作。 對於大塊,可能需要一段時間。 但是如果有多個較小的線程塊占用SM,則SM可以在等待第一個塊中的__syncthreads滿足時切換並從其他塊執行工作。 這有助於減少GPU空閑時間並提高效率。

您不一定非常希望擁有非常小的塊(因為Fermi上的SM支持最多8個駐留塊),但是擁有128-512個線程的塊通常比使用1024個線程的塊更有效。

如果您的cuda啟用卡中只有一個 SM,則超過3個塊將不會改變您的情況下的吞吐量。 通常,您在一個GPU中有8個或更多SM。

在一個SM上運行的塊數也不僅僅取決於warp的數量。 這只是一個限制因素,還有許多其他因素。 CUDA占用計算器是查看內核占用情況的絕佳工具。

暫無
暫無

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

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