2012-05-07 41 views
1

我目前正在使用CUDA開發nVidia GTX 480。根據規範,該卡有15個流式多處理器(SM),每個核心有32個CUDA核心。顯示驅動程序本身使用了哪些CUDA資源?

我的代碼與每個32個內核的N塊一起使用。

理想情況下,如果N <= 15,我認爲,由於每個塊可以分配到不同的SM,每個塊將運行速度與單個塊一樣快。對於'N> 15',當塊開始共享SM時,每個塊的性能應該衰減。如果maxocc是我的內核的最大佔用率,那麼性能應該停滯在N > 15*maxocc,因爲並非所有塊都可以在SM上進行調度。

這也是幾乎我在實踐中觀察:每個塊的性能開始衰變爲N = 12和性能停滯爲N = 57,即這是因爲如果有佔用短信三個額外的塊。

我沒有其他運行的程序使用GTX 480.但是,該卡連接到運行文本控制檯的外部顯示器,即不是X-windows。

現在的問題:有誰知道如果使用GTX 480驅動控制檯佔用CUDA資源?如果是這樣,究竟有多少?我該如何避免這種情況,即,如何完全禁用視頻輸出而不關閉CUDA設備?

回答

1

猜測一束遵循:

我猜,舊的CGA文本模式模擬的,所以沒有專用硬件爲他們費米芯片上。然後有可能在每個vblank中調用一個着色器來呈現CGA文本緩衝區的當前狀態。

我還猜測這些卡片不支持當時正在使用的低分辨率或單色顏色深度。結果是可能有很多32位像素必須以60 FPS更新才能渲染CGA文本。

需要嘗試的一件事是添加另一個圖形卡或使用板載圖形(如果可用),以便您可以在未連接顯示器的情況下運行CUDA卡。如果您嘗試此操作,請確保將非CUDA卡設置爲PC BIOS中的主要圖形卡。

3

CUDA架構不保證在15個SM設備上每個SM分配15個塊。計算工作分銷商可能將2個塊分配給多個SM。並行Nsight指令統計實驗顯示了每個SM啓動的Warps圖和每個SM的活動循環圖。在你的情況下,我相信你會發現分佈爲:9個SM有1個區塊,3個SM有2個區塊,3個SM沒有區塊。

如果您啓動的SM計數塊數少於此值,則可以嘗試通過將每個塊的動態共享內存增加到1/2共享內存+ 1個字節來強制每塊SM執行1個塊(這被指定爲第3個參數三角括號)。這將強制每個SM佔用一個塊。如果你這樣做並試圖運行併發內核,你可能會影響併發性。

在當前體系結構中,當內核運行時,CUDA上下文獨佔使用所有SM。

+0

感謝您的回覆!調度器會讓SM閒置似乎有點奇怪。你對它的工作原理有很好的參考?由於我在非Windows機器上,我無法使用Parallel Nsight來驗證這一點。 – Pedro

+0

我無法找到此行爲的參考。建議網格發起足夠的工作來填充設備。如果啓動不填充設備,則可能會出現一些調度工件。如果您對調查行爲感興趣,則可以使用PTX特殊變量%smid(請參見內聯PTX示例)來創建每個SM軟件計數器。在您的內核開始時讀取%smid,並讓每個warp(或block)以原子方式遞增該SM的軟件計數器。 –

+0

在爲我的代碼添加彙編調用來驗證這一點之前,我真的很想知道這種行爲是由nVidia在某處描述的,而不僅僅是一種預感。您是否有任何關於調度程序的工作原理? – Pedro