對指針和地址比較熟悉的童鞋可以比較容易的理解這個概念,為了更好的讓更多的人理解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這個指針的地址,然后改變這個地址的內容就會帶給實參真正的改變。
“指針”也是一種變量,之所以叫他指針,完全是因為它的值是內存地址。
既然指針是變量,那么變量也是需要存儲空間的。
cudaMalloc的第一個參數傳遞的是存儲在cpu內存中的指針變量的地址,cudaMalloc在執行完成后,向這個地址中寫入了一個地址值(此地址值是GPU顯存里的)。
https://blog.csdn.net/bendanban/article/details/8151335