2011-04-12 43 views
2

是否可以將內存添加到全局內存中先前分配的數組?將更多的內存分配給現有的全局內存陣列

什麼,我需要做的是這樣的:

//cudamalloc memory for d_A 
int n=0;int N=100; 
do 
{ 
Kernel<<< , >>> (d_A,n++); 
//add N memory to d_A 
while(n!=5)} 

確實做一套cudamalloc刪除以前分配的數組的值?在我的情況下,應該保持以前分配的數組的值...

+1

如果您對coc中的malloc,realloc和free不熟悉(僅舉幾個例子),您會發現編寫CUDA程序是不可能的。一心一意!! – jmilloy 2011-04-12 15:12:18

回答

-2

我不知道cuda增加了混合(?)會有什麼併發症,但是在c中,您無法將內存添加到已分配的數組中。

如果你想增長一個malloc'd數組,你需要malloc一個你需要的大小的新數組,並複製現有數組中的內容。

如果你經常這樣做,那麼爲了避免代價高昂(在處理時間方面)重新分配操作,它可能比每次需要更多的mallocing。

+0

'realloc'將內存添加到已經有'malloc'ed的數組中。但是,沒有cudaMalloc,所以你的答案確實適用。 – 2011-04-12 08:30:02

+0

我相信'realloc'只有在當前塊有剩餘空間的情況下才會這樣。否則,它只是分配新的空間和拷貝整個舊數據完全如上所述。 – 2011-04-12 15:28:26

+2

你相信不正確。'realloc'擴展塊,如果有未分配的空間後面(如果沒有,當然它必須重新定位塊)。關鍵是,你的陳述「如果你想成長......」是不正確的,並且是錯誤的做法,因爲realloc通常效率更高,並且肯定更容易且更不容易出錯。 – 2011-04-12 22:08:22

3

您的psuedocode根本不會「向先前分配的數組添加內存」。增加現有分配大小的標準C方法是通過realloc()函數,並且在編寫本文時,沒有與realloc()等效的CUDA。

當你

cudaMalloc(d_A....) 

// something 

cudaMalloc(d_A....) 

所有你正在做的是創造一個新的內存分配,其分配給D_A。之前的內存分配仍然存在,但是現在你已經丟失了以前內存的指針值,並且無法訪問它。基於這個和你以前的幾乎同一主題的問題,我建議你在嘗試CUDA之前花些時間修改C語言中的內存和指針概念,因爲除非你對這些基礎知識有非常清楚的理解,否則你會發現CUDA的分佈式內存本質很混亂,

+2

減輕 - 註釋//將N內存添加到d_A旨在用於不存在的cuda realloc函數的僞代碼。上述評論爲 – jmilloy 2011-04-12 15:10:37

+0

-1; talonmies是對的。 – 2011-04-12 22:11:18

+0

@ jim-balter我認爲talonmies的第一句話除了第一句 – jmilloy 2011-04-13 12:43:47

5

首先,cudaMalloc的行爲與malloc不同,不是realloc。這意味着cudaMalloc將在新的位置分配全新的設備內存。 cuda API中沒有realloc函數。

其次,作爲一種解決方法,您可以再次使用cudaMalloc來分配更多的內存。請記住在將新地址分配給d_a之前,先用cudaFree釋放設備指針。以下代碼是功能你想要什麼。

int n=0;int N=100; 

//set the initial memory size 
size = <something>; 

do 
{ 
    //allocate just enough memory 
    cudaMalloc((void**) &d_A, size); 

    Kernel<<<...>>> (d_A,n++); 

    //free memory allocated for d_A 
    cudaFree(d_A); 

    //increase the memory size 
    size+=N; 

while(n!=5)} 

第三,cudaMalloc可能是一個昂貴的操作,我期望上面的代碼會很慢。我認爲你應該考慮爲什麼你想增加陣列。你能分配內存給d_A一次有足夠的內存用於最大的用例嗎?如果您知道以後需要1,000個字節,則可能沒有理由只分配100個字節!

//calculate the max memory requirement 
MAX_SIZE = <something>; 

//allocate only once 
cudaMalloc((void**) &d_A, MAX_SIZE); 

//use for loops when they are appropriate 
for(n=0; n<5; n++) 
{ 
    Kernel<<<...>>> (d_A,n); 
} 
+1

+1:「如果你知道以後需要1,000字節,沒有理由只分配100個字節!」 – LumpN 2011-04-12 15:23:33