在cuda __device__函数中分配(malloc)双**

时间:2014-04-24 04:49:33

标签: c++ cuda

这里似乎有很多关于从主机到设备移动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);

为我工作!

1 个答案:

答案 0 :(得分:2)

GPU端malloc()是来自有限堆的子分配器。根据分配的数量,堆可能会耗尽。您可以使用cudaDeviceSetLimit(cudaLimitMallocHeapSize, size_t size)更改支持堆的大小。有关详细信息,请参阅:CUDA programming guide