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

Allocating (malloc) a double** in cuda __device__ function

本文关键字:一个 cuda device 分配 malloc 函数      更新时间:2023-10-16

关于将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__ mallocs工作得很好,在多维情况下似乎无法保持稳定。顺便说一下,变量有时是这样使用的:

double** z=matrixCreate(2,2,0);
double* x=z[0];

然而,始终要注意确保不会使用活动数据进行免费呼叫。该代码实际上是对纯cpu代码的改编,所以我知道指针或内存没有什么有趣的地方。基本上,我只是重新定义分配器,并在串行部分上抛出一个__device__。只想运行整个串行位10000次,GPU似乎是一个很好的方法。

++++++++++++++更新+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Vyas解决了问题。根据cuda规范,堆大小最初设置为8Mb,如果mallocs超过这个值,NSIGHT将不会启动,内核将崩溃。使用主机代码下的以下内容。

float increaseHeap=10;
cudaDeviceSetLimit(cudaLimitMallocHeapSize, size[0]*increaseHeap);

为我工作!

GPU端malloc()是来自有限堆的子分配程序。根据分配的数量,堆可能正在耗尽。您可以使用cudaDeviceSetLimit(cudaLimitMallocHeapSize, size_t size)更改备份堆的大小。有关更多信息,请参阅:CUDA编程指南