2017-04-12 142 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