【问题标题】:Allocating (malloc) a double** in cuda __device__ function在 cuda __device__ 函数中分配(malloc)双**
【发布时间】:2014-06-09 05:13:05
【问题描述】:

似乎这里有很多关于将双精度(或整数、浮点数等)二维数组从主机移动到设备的问题。这不是我的问题。

我已经将所有数据转移到 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);

为我工作!

【问题讨论】:

  • mallocfree 都可以,假设您包含 &lt;stdlib.h&gt;,并且您检查每个 malloc 是否不返回 NULL。也许您的代码中的其他地方发生了内存损坏,而这并没有在 CPU 版本中触发任何可见的影响。你能更好地描述你的症状和/或发布一个重现失败的测试用例吗?
  • @MattMcNabb 让我们希望这是 C 非常强大。C++ 中的malloc() 是有害的。
  • 您是否尝试通过cuda-memcheck 运行您的代码?您是否还尝试对来自malloc 的返回指针添加检查? GPU 端malloc() 是来自有限堆的子分配器。根据分配的数量,堆可能已耗尽。您可以使用cudaDeviceSetLimit(cudaLimitMallocHeapSize, size_t size) 更改后备堆的大小。欲了解更多信息,请参阅:link
  • 如果它在单维情况下运行良好,您是否考虑过线性化矩阵并解决它,例如i + j*M?这样,无论何时处理内存,您都可以将其视为单个内存块。
  • @Vyas:您想添加一个简短的答案以将其从未答复列表中删除吗?

标签: c++ cuda


【解决方案1】:

GPU 端 malloc() 是来自有限堆的子分配器。根据分配的数量,堆可能已耗尽。您可以使用cudaDeviceSetLimit(cudaLimitMallocHeapSize, size_t size) 更改后备堆的大小。欲了解更多信息,请参阅:CUDA programming guide

【讨论】:

    猜你喜欢
    • 2020-01-31
    • 2014-07-17
    • 2013-11-22
    • 2011-08-08
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    相关资源
    最近更新 更多