簡體   English   中英

cudaMalloc在哪個內存空間中分配內存?

[英]Which memory space does cudaMalloc allocate memory in?

如果我理解正確,CUDA設備將具有一些不同的存儲空間 (例如,注冊,本地,共享,全局等)。 調用cudaMalloc() ,分配的內存駐留在哪個內存空間中?

例如:

__global__ mykernel (void *p) {
    /* What memory space does p point to? */
    printf("p: %p\n", p);
}

int main() {
    void *p;
    assert(cudaMalloc (&p, 1024) == CUDA_SUCCESS);
    mykernel<<<1,1024>>> (p);
}

文檔沒有提到在什么級別分配內存。 只說

在設備上分配線性內存的size字節,並返回指向已分配內存的指針。 分配的內存適合於任何類型的變量。 內存未清除。

似乎內存必須駐留在全局/常量/紋理空間之一中,但是哪一個呢?

假設內存永遠不會在本地/寄存器/共享內存空間中,這是否也安全?

全球

cudaMalloc在全局內存中分配。 全局內存分配的另一種方法是在內核內部使用newdelete

__global__ void myKernel(int N)
{
     int* a = new int[N]; // not recommended
     delete [] a;
}

共享

對於動態共享內存,您可以使用諸如

extern __shared__ int s[];

並像這樣啟動內核

myKernel<<<1,n,n*sizeof(int)>>();

或者只是__shared__ int s[4]; (在內核內部)用於靜態共享內存


寄存器

對於注冊,您可以考慮使用C ++進行自動分配(僅從語法角度而言):

int example = 0;
int moreExample[4]

主要的區別是,如果用完寄存器存儲器,則將導致寄存器溢出,並且變量可能最終存儲在全局存儲器中,而不是寄存器中。

暫無
暫無

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

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