在cuda __device__函数中分配(malloc)一个双**
Allocating (malloc) a double** in cuda __device__ function
关于将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编程指南
相关文章:
- 带有Cuda的LibTorch(C++)引发了一个异常
- 在CUDA内核中传递一个常数整数
- CUDA C++:文件中 kernel.cu 应有一个表达式
- 为什么在循环中重复一个内核会使CUDA代码明显较慢
- CUDA中一个简单Z缓冲区的实现
- 只有一个线程执行 CUDA 内核
- CUDA推力:从一个设备复制到另一个设备
- 想要用cuda内核执行一个循环直到用户取消
- 编译一个不支持c++11和.cxx文件的cuda代码需要一个带有vexcl示例的c++11
- CUDA 如何欺骗内核认为它在另一个线程中?
- 在每个主机线程(多线程 CPU)上创建一个 cuda 流
- 为什么一个简单的 CUDA 函数需要这么多本地内存
- Cuda:同步n个内核函数中的一个
- 在visualstudio中向现有的c项目添加一个cuda文件
- CUDA在多个数据上合并了一个扭曲
- 是否有可能在CUDA的另一个内核函数中调用一个内核函数?
- 在ubuntu上运行cuda -它是否需要一个本地设备驱动程序(使用nvidia显卡)
- 编写一个CUDA内核来替换一个等效的cpu函数
- Cuda如何从全局函数运行多个线程?一个运行多个线程的内核
- 如何在 c++ 中调用另一个 mex (MATLAB) 对象文件中的一个 cuda 对象文件的函数?