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