[英]Can I allocate more memory than necessary with cudaMalloc to avoid reallocating?
[英]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
在全局內存中分配。 全局內存分配的另一種方法是在內核內部使用new
和delete
。
__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.