这里似乎有很多关于从主机到设备移动double(或int,或float等)2d数组的问题。这不是我的问题。
我已将所有数据移到GPU上,__global__
内核调用了几个__device__
函数。
在这些设备内核中,我尝试了以下内容:
分配:
__device__ double** matrixCreate(int rows, int cols, double initialValue)
{
double** temp; temp=(double**)malloc(rows*sizeof(double*));
for(int j=0;j<rows;j++) {temp[j]=(double*)malloc(cols*sizeof(double));}
//Set initial values
for(int i=0;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
temp[i][j]=initialValue;
}
}
return temp;
}
要解除分配:
__device__ void matrixDestroy(double** temp,int rows)
{
for(int j=0;j<rows;j++) { free( temp[j] ); }
free(temp);
}
对于单维数组,__device__
malloc工作得很好,似乎无法在多维情况下保持稳定。顺便说一下,变量有时会像这样使用:
double** z=matrixCreate(2,2,0);
double* x=z[0];
但是,始终注意确保不会使用活动数据进行免费调用。代码实际上只是对cpu代码的修改,所以我知道指针或内存没什么好笑的。基本上我只是重新定义分配器并在串行部分上抛出__device__
。只想运行整个串行位10000次,GPU似乎是一个很好的方法。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++ Vyas解决了问题。根据cuda规范,堆大小最初设置为8Mb,如果malloc超过此值,NSIGHT将无法启动并且内核崩溃。在主机代码下使用以下内容。
float increaseHeap=10;
cudaDeviceSetLimit(cudaLimitMallocHeapSize, size[0]*increaseHeap);
为我工作!
答案 0 :(得分:2)
GPU端malloc()
是来自有限堆的子分配器。根据分配的数量,堆可能会耗尽。您可以使用cudaDeviceSetLimit(cudaLimitMallocHeapSize, size_t size)
更改支持堆的大小。有关详细信息,请参阅:CUDA programming guide