是否可以將內存添加到全局內存中先前分配的數組?將更多的內存分配給現有的全局內存陣列
什麼,我需要做的是這樣的:
//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刪除以前分配的數組的值?在我的情況下,應該保持以前分配的數組的值...
是否可以將內存添加到全局內存中先前分配的數組?將更多的內存分配給現有的全局內存陣列
什麼,我需要做的是這樣的:
//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刪除以前分配的數組的值?在我的情況下,應該保持以前分配的數組的值...
我不知道cuda增加了混合(?)會有什麼併發症,但是在c中,您無法將內存添加到已分配的數組中。
如果你想增長一個malloc'd數組,你需要malloc一個你需要的大小的新數組,並複製現有數組中的內容。
如果你經常這樣做,那麼爲了避免代價高昂(在處理時間方面)重新分配操作,它可能比每次需要更多的mallocing。
'realloc'將內存添加到已經有'malloc'ed的數組中。但是,沒有cudaMalloc,所以你的答案確實適用。 – 2011-04-12 08:30:02
我相信'realloc'只有在當前塊有剩餘空間的情況下才會這樣。否則,它只是分配新的空間和拷貝整個舊數據完全如上所述。 – 2011-04-12 15:28:26
你相信不正確。'realloc'擴展塊,如果有未分配的空間後面(如果沒有,當然它必須重新定位塊)。關鍵是,你的陳述「如果你想成長......」是不正確的,並且是錯誤的做法,因爲realloc通常效率更高,並且肯定更容易且更不容易出錯。 – 2011-04-12 22:08:22
您的psuedocode根本不會「向先前分配的數組添加內存」。增加現有分配大小的標準C方法是通過realloc()函數,並且在編寫本文時,沒有與realloc()等效的CUDA。
當你
cudaMalloc(d_A....)
// something
cudaMalloc(d_A....)
所有你正在做的是創造一個新的內存分配,其分配給D_A。之前的內存分配仍然存在,但是現在你已經丟失了以前內存的指針值,並且無法訪問它。基於這個和你以前的幾乎同一主題的問題,我建議你在嘗試CUDA之前花些時間修改C語言中的內存和指針概念,因爲除非你對這些基礎知識有非常清楚的理解,否則你會發現CUDA的分佈式內存本質很混亂,
首先,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,000字節,沒有理由只分配100個字節!」 – LumpN 2011-04-12 15:23:33
如果您對coc中的malloc,realloc和free不熟悉(僅舉幾個例子),您會發現編寫CUDA程序是不可能的。一心一意!! – jmilloy 2011-04-12 15:12:18