我在课程中使用cudaMallocHost()
和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();
}
上述代码在调用cudaFreeHost()
时返回错误无效参数(值11),cudaFreeHost
不会返回错误。
我尝试将指针数组更改为不同的变量,但错误仍然存在。我甚至将cudaFreeHost()
放在cudaMallocHost()
之后,但仍有错误。
我确认每次拨打cudaFreeHost()
时都不会发生错误。
添加cudaDeviceSynchronize()
以确保完成所有复制操作。
如果我将所有cudaHost操作改为正常操作(即new和delete),程序运行正常。
我尝试将位图中的每个变量更改为b1,b2,b3,b4,b5,如下所示,但同样的错误发生。
cudaMallocHost(&b1, sizeof(int) * 10000);
cudaFreeHost(b1);
答案 0 :(得分:-2)
通过在分配存储器之前首先将该点初始化为零来解决该问题,即在for循环的开始处添加位图[i] = 0。 不确定这会如何影响结果,但它确实有效。