簡體   English   中英

有關CUDA內存的問題

[英]Questions about CUDA memory

我對CUDA編程還很陌生,我對一些關於內存模型的東西還不清楚。 就像,它如何運作? 例如,如果我有一個簡單的內核

__global__ void kernel(const int* a, int* b){ 
    some computation where different threads in different blocks might      
    write at the same index of b
}

因此,我想a將在所謂的恆定內存中。 但是b呢? 由於不同塊中的不同線程將寫入其中,它將如何工作? 我在某處讀到,可以保證在同一塊中的不同線程在全局內存中進行並發寫入的情況下,至少可以寫入一個,但是不能保證其他寫入。 我是否需要擔心這一點,例如,將塊中的每個線程都寫入共享內存中,一旦全部完成,就全部寫入全局內存中了嗎? 還是CUDA替我照顧了它?

因此,我想a將在所謂的恆定內存中。

是的, a 指針將是恆定的存儲器,但不是因為它被標記const (這是完全正交的)。 b 指針也位於常量存儲器中。 所有內核參數都在恆定內存中傳遞(CC 1.x中除外)。 從理論上講, ab指向的內存可以是任何東西(設備全局內存,主機固定的內存,UVA可尋址的任何東西)。 用戶選擇它所在的位置。

我在某處讀到,可以保證在同一塊中的不同線程在全局內存中進行並發寫入的情況下,至少可以寫入一個,但是不能保證其他寫入。

假設您的代碼如下所示:

b[0] = 10; // Executed by all threads

然后是的,這是(良性)競爭條件,因為所有線程都將相同的值寫入相同的位置。 定義了寫入的結果,但是未指定寫入的次數,執行“最終”寫入的線程也未指定。 唯一的保證是至少發生一次寫操作。 在實踐中,我相信每個扭曲都會發出一次寫操作,如果您的塊包含多個扭曲(它們應該這樣做),那將浪費帶寬。

另一方面,如果您的代碼如下所示:

b[0] = threadIdx.x;

這是普通的未定義行為。

我是否需要擔心這一點,例如,將塊中的每個線程都寫入共享內存中,一旦全部完成,就全部寫入全局內存中了嗎?

是的,通常就是這樣。

暫無
暫無

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

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