求教:malloc申请内存失败内存申请总量的问题

他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)只需一步,快速开始
查看: 760|回复: 5
cudaMalloc() 申请内存块问题
您好,我想问一下,我用cudaMalloc()为一个矩阵申请一块内存,现在我想取矩阵的一部分数据进行处理,比如说,矩阵M*M,要从这块内存想取最后一行的数据,怎么取出来?指针怎么传递?
楼主您好, 您的问题实际上可以拆分为两个问题:
(1)从一个大矩阵中抽取出来一个小矩阵
(2)访问小矩阵中的数据.
这有多种解决方案的, 常见的有两种, 一种是需要为小矩阵单独分配空间, 然后从大矩阵中复制小矩阵的内容出来, 这种情况对于非常小的子矩阵往往具有较好的访问效果, 但需要额外的存储空间. 这里不说.
而另外一种方案则是不额外分配小矩阵的空间, 而是进行指针(或者说下标)变换. 感觉你可能需要这种, 所以这里简单说下:
假设你有一个大矩阵A, 一共有H行, 每行有W个元素. 因为CUDA C按照行存储优先. 所以如果需要从大矩阵A中取出小矩阵B(假设B是从A的(x0, y0)开始取出, 分别有h行, 每行有w个元素), 则:
下标变换方式:
原本如果大矩阵A是: type *A; 访问访问是A[y * W + x],&&
那么小矩阵的访问方式是: A[(y + y0) * W + (x&&+ x0)],
注意下标变换方式中, 小矩阵B的每行宽度(w)实际没有在这里用到, 但是你需要确保你的x在从[0, w)的范围内.
或者可以采用指针推导方式:
如果原本大矩阵是: type *A, 访问方式是A[y * W + x],
那么小矩阵是: type *B = &A[y0 * W + x0], 而访问方式是B[y * W + x]
注意无论那一种, 下标中(或者指针中)都没有出现小写w.
感谢深夜来访.
祝您生活和工作愉快.
是这样的,我在用cublas库的乘法函数cublasSgemm() 计算矩阵乘法,比如说A*AT=B ,A是M*N,B是M*M。
现在我需要取出矩阵A的一部分数据,比如前k行,即k*N,这部分数据做乘法运算,正常设置函数中的指针,行,列,但计算结果和CPU计算结果不一致。
原:cublasSgemm(handle,CUBLAS_OP_N,CUBLAS_OP_N,M,M,N,&alpha,A,M,AT,N,&beta,B,M);& & & &
改:cublasSgemm(handle,CUBLAS_OP_N,CUBLAS_OP_N,k,k,N,&alpha,A,k,AT,N,&beta,B,k);& & & &
除此之外,在用cudaMemcpy() 进行内存块之间的数据传输时,,尤其是二维数组的访问,比如说,我把一个一维数组传输到到二维数组的某一行,一维数组X(1*N),二维数组A(M*N),当把X复制到A的某一行时,即使我把指针改为那一行的头指针,复制会出现错误。我想问一下,有没有别的访问二维数组的方法,我的理解有问题吗?
楼主您好, 我不懂cublas的。
但是根据您的描述,cudaMemcpy也出现问题,这就奇怪了。能否说一下您的“2维数组”是啥?因为根据多年的经验,很多人往往会错误的将二级指针构成的数组当成二维数组, 虽然这两者在形式上很像。
感谢来访。
我说的二维数组是用cudaMalloc()申请的内存块,比如说我的矩阵是M*N,然后申请一个一级指针,指向这个M*N大小的内存块,现在我要把另一个1*N的内存块复制到矩阵M*N的某一行:
cudaMemcpy(dev_X, &dev_A[N], N*sizeof(type), cudaMemcpyDeviceToDevice);
这样合法吗?如果不合法有没有别的办法。
您没有说明您的dev_X和dev_A哪个是大矩阵,哪个是小的。
如果(假设)这里的dev_X是小矩阵,dev_A[N]是某行的行首元素,同时行有效元素宽度等于实际行宽(pitch)的话,同时都是采用的cudaMalloc分配的,然后从后者传输到前者,显然这样做是合法的。倒不需要担忧。
请楼主描述一下您为何失败了。如果可能,请您提供真实代码,和相关的错误代码。
以便论坛为您分析解决。
感谢来访。
站长推荐 /1
为了更好地为各位会员提供技术支持服务,本论坛采用注册审核制度。您注册会员后,我们的管理人员会在8小时内在后台进行审核,审核通过会发邮件通知。只要是真实的开发者或学习者,我们都会审核通过。敬请谅解!如果您着急的话,可以发邮件至: 提醒我们第一时间审核通过。_malloc和new申请内存失败后的处理
_malloc和new申请内存失败后的处理
// malloc 的写法
char* buffer = (char*)malloc(1024);
if(buffer)
printf(&malloc success!\r\n&);
free(buffer);
// new的写法
char* buffer = new char[1024];
catch(...)
printf(&operator new error!\r\n&);
对于malloc方式申请的内存,通过是否是零指针区别;
对于new方式申请的内存,通过C++异常机制处理。

我要回帖

更多关于 malloc申请内存初始化 的文章

 

随机推荐