如何理解CUDA中的cudaMalloc()的参数

Posted aban-mtd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何理解CUDA中的cudaMalloc()的参数相关的知识,希望对你有一定的参考价值。

对指针和地址比较熟悉的童鞋可以比较容易的理解这个概念,为了更好的让更多的人理解cudaMalloc的参数,写这篇文章,以飨读者。

首先看下此运行时函数的原型:

cudaError_t cudaMalloc (void **devPtr, size_t  size ); 

此函数返回值是CUDA中定义的一个错误代码。


主要的第一个参数。为什么是两个星星呢?用个例子来说明下。

float *device_data=NULL;
size_t size = 1024*sizeof(float);
cudaMalloc((void**)&device_data, size);

上面这个例子中我在显存中申请了一个包含1024个单精度浮点数的一维数组。而device_data这个指针是存储在主存上的。之所以取device_data的地址,是为了将cudaMalloc在显存上获得的数组首地址赋值给device_data。在函数中为形参赋值是不会在实参中繁盛变化的,但是指针传递的是地址,我们操作了某个地址的数据,实际上是真的改变了指定地址的数据。像这个申请显存的函数,第一个参数传递的是device_data这个指针的地址,然后改变这个地址的内容就会带给实参真正的改变。


如果大家不明白,留言奥。


2015年3月13号16点42分追加:

“指针”也是一种变量,之所以叫他指针,完全是因为它的值是内存地址。

既然指针是变量,那么变量也是需要存储空间的。

cudaMalloc的第一个参数传递的是存储在cpu内存中的指针变量的地址,cudaMalloc在执行完成后,向这个地址中写入了一个地址值(此地址值是GPU显存里的)。

以上是关于如何理解CUDA中的cudaMalloc()的参数的主要内容,如果未能解决你的问题,请参考以下文章

如何理解Cuda中的cudaMalloc函数的第一个参数是两个星星?

如何理解Cuda中的cudaMalloc函数的第一个参数是两个星星?

CUDA C

cudaMalloc 在哪个内存空间分配内存?

我应该如何以及何时将倾斜指针与 cuda API 一起使用?

从版本 285 开始,nvidia 驱动程序中 cudaMalloc 的灾难性减速