2017-04-12 173 views
-2

我正在使用cudaMallocHost()cudaFreeHost()。調用cudaFreeHost()cudaFreeHost不返回錯誤時cudaFreeHost()無效參數錯誤

#include "cuda.h" 
#include "cuda_runtime.h" 

class myClass{ 
public: 
    int* bitmap[5]; 
    void Malloc(){ 
     for (int i = 0 ; i < 5 ; i++){ 
      cudaMallocHost(&bitmap[i], sizeof(int)*10000); 
      memset(bitmap[i], 0, sizeof(int)*10000); 
     } 
    } 
    void Delete(){ 
     for (int i = 0 ; i < 5; i++){ 
      cudaFreeHost(bitmap[i]); 
     } 
    } 
}; 
int main(){ 
    myClass mc; 
    mc.Malloc(); 
    //copy 'bitmap[]' to gpu and call some kernel function 
    cudaDeviceSynchronize(); 
    mc.Delete(); 
} 

上面的代碼返回錯誤的參數無效(價值11):我的代碼示例。

我試圖將指針數組更改爲不同的變量,但錯誤仍然存​​在。我甚至在cudaMallocHost()後面加上cudaFreeHost(),但仍然有錯誤。

我確認每次我撥打cudaFreeHost()時都不會發生錯誤。

添加cudaDeviceSynchronize()以確保完成所有複製操作。

如果我將所有cudaHost操作更改爲正常操作(即新建和刪除),則該程序正常工作。

我試圖將位圖中的每個變量更改爲b1,b2,b3,b4,b5,如下所示,但會發生相同的錯誤。

cudaMallocHost(&b1, sizeof(int) * 10000); 
cudaFreeHost(b1); 
+0

你能提供你的原始代碼嗎?您提供的示例不是合法的C++ – willkill07

+0

嘗試'int * bitmap [5];'而不是'int bitmap [5];' –

+0

@ willkill07對於草率代碼感到抱歉。我編輯它,它現在應該是合法的C++ – Edward

回答

-2

問題是由第一解決初始化到零之前分配的存儲器,即在的開始的for循環中添加的位圖[I] = 0的點。 不太確定這是如何影響結果,但它的工作原理。

+0

初始化指針不太可能導致您的代碼出現任何問題。 – einpoklum

+0

@einpoklum,我知道這聽起來很奇怪,無法解釋。但是,我對代碼周圍的指針沒有做任何事情。正如問題所述,我試圖在相同的函數中分配和釋放內存,但是當釋放內存時仍然有錯誤(代碼的其他部分沒有錯誤)。如果代碼中有其他錯誤,我認爲代碼的其他部分應該有錯誤。如果我在GTX970和1080上用cuda 7初始化指針爲零,則不會發生錯誤。我也渴望知道爲什麼發生這種情況。謝謝。 – Edward