簡體   English   中英

cuda kernel 在不同的 NVIDIA GPU 上具有無限循環的奇怪行為

[英]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. GPU(Geforce 940M) 操作系統(Ubuntu 18.04) MPS(啟用) CUDA(v11.0)
  • 2. GPU(Geforce RTX 3050Ti Mobile) OS(Ubuntu 20.04) MPS(Enable) CUDA(v11.4)

實驗 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。)

我對這些結果感到困惑,這是我的問題:

  • 1.為什么配置1下系統output沒有smid?
  • 2. 為什么GUI系統在配置1下似乎卡住了?
  • 3. 與實驗1不同,為什么實驗2 output smid 正常?
  • 4. 第三個實驗,block 配置達到 1024 個線程,這意味着不能將兩個不同的 block 調度到同一個 SM。 Under MPS environment, all CUDA contexts will be merged into one CUDA context and share the GPU resource without timeslice anymore, but why do I still get same smid in the third experiment?(Furthermore, as I change the grid configuration into 10 and run it兩次,smid 從 0 到 19 變化,每個 smid 只出現一次!)
  1. 為什么系統output在配置1下沒有smid?

一個安全的經驗法則是,與主機代碼不同,內核中的printf output 不會在遇到語句時打印到控制台,而是在 Z50484C19F1AFDAF3841A0D821ED3 和同步設備完成時打印到控制台。 這是配置 1 中有效的實際方案,它使用 maxwell gpu。 因此在配置 1 中沒有觀察到printf output,因為 kernel 永遠不會結束。

  1. 為什么 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. 與實驗 1 不同,為什么實驗 2 output smid 正常?

盡管沒有很好的記錄,但計算搶占過程似乎引入了一個額外的同步點,允許刷新printf緩沖區,如第 1 點所述。如果您閱讀我在此處鏈接的文檔,您將看到“同步點" 涵蓋了許多可能性,並且計算搶占似乎引入了(一種新的)一種可能性。

抱歉,目前無法回答您的第 4 個問題。 SO 的最佳實踐是每個問題問一個問題。 但是,我認為將 MPS 與 GPU 一起使用是“不尋常的”。 由於我們已經確定計算搶占在這里有效,可能是由於計算搶占以及服務顯示器的需要,GPU 以循環時間片方式為客戶端提供服務(因為無論如何它都必須這樣做維修顯示器)。 在這種情況下,MPS 下的行為可能會有所不同。 計算搶占允許您描述的通常限制無效。 一個 kernel 可以完全替代另一個。

暫無
暫無

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

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