[英]Strange behaviors of cuda kernel with infinite loop on different NVIDIA GPU
#include <cstdio>
__global__ void loop(void) {
int smid = -1;
if (threadIdx.x == 0) {
asm volatile("mov.u32 %0, %%smid;": "=r"(smid));
printf("smid: %d\n", smid);
}
while (1);
}
int main() {
loop<<<1, 32>>>();
cudaDeviceSynchronize();
return 0;
}
This is my source code, the kernel just print smid when thread index is 0 and then go to infinite loop, and the host just invoke the previous cuda kernel and wait for it. 我在 2 種不同的配置下進行了一些實驗,如下所示:
實驗 1 :當我在配置 1下運行此代碼時,GUI 系統似乎被凍結,因為無法再觀察到任何圖形響應,但當我按 ctrl+c 時,這種現象隨着 CUDA 進程被殺死而消失。
實驗二:我在配置2下運行這段代碼,系統似乎運行良好,沒有任何異常現象,可以顯示smid的output如smid: 2\n
。
實驗 3 :當我更改塊配置loop<<<1, 1024>>>
並在配置 2下運行此新代碼兩次時,我得到相同的 smid output 例如smid: 2\nsmid: 2\n
。(至於Geforce RTX 3050Ti Mobile,SM數量為20,每個多處理器的最大線程數為1536,每個塊的最大線程數為1024。)
我對這些結果感到困惑,這是我的問題:
- 為什么系統output在配置1下沒有smid?
一個安全的經驗法則是,與主機代碼不同,內核中的printf
output 不會在遇到語句時打印到控制台,而是在 Z50484C19F1AFDAF3841A0D821ED3 和同步設備完成時打印到控制台。 這是配置 1 中有效的實際方案,它使用 maxwell gpu。 因此在配置 1 中沒有觀察到printf
output,因為 kernel 永遠不會結束。
- 為什么 GUI 系統在配置 1 下似乎被凍結?
出於本次討論的目的,有兩種可能的機制:一種是 pre-pascal 機制,其中計算搶占是不可能的,另一種是 post-pascal 機制,其中計算搶占是可能的。 您的配置 1 是一個 maxwell 設備,它是 pre-pascal。 您的配置 2 是安培設備,它是后帕斯卡的。 所以在配置 2 中,計算搶占是有效的。 這有多種影響,其中之一是 GPU 將同時滿足 GUI 需求和計算 kernel 需求,“同時”(低級行為沒有完整記錄,但它是一種時間片形式,交替關注計算 kernel 和 GUI)。 因此,在配置 1(pre-pascal)中,運行任何明顯時間的內核都會在 kernel 執行期間“凍結”GUI。 在 config2 中,GPU 在某種程度上為兩者提供服務。
- 與實驗 1 不同,為什么實驗 2 output smid 正常?
盡管沒有很好的記錄,但計算搶占過程似乎引入了一個額外的同步點,允許刷新printf
緩沖區,如第 1 點所述。如果您閱讀我在此處鏈接的文檔,您將看到“同步點" 涵蓋了許多可能性,並且計算搶占似乎引入了(一種新的)一種可能性。
抱歉,目前無法回答您的第 4 個問題。 SO 的最佳實踐是每個問題問一個問題。 但是,我認為將 MPS 與 GPU 一起使用是“不尋常的”。 由於我們已經確定計算搶占在這里有效,可能是由於計算搶占以及服務顯示器的需要,GPU 以循環時間片方式為客戶端提供服務(因為無論如何它都必須這樣做維修顯示器)。 在這種情況下,MPS 下的行為可能會有所不同。 計算搶占允許您描述的通常限制無效。 一個 kernel 可以完全替代另一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.