CUDA總結2——cudaMemcpy

windxgz發表於2020-09-25

在使用cuda的時候一定會用到cudaMemcpy這個函式,因為我們就是用它實現資料在CPU與GPU之間的移動,想在GPU端計算就必須要將資料從CPU拷貝到GPU,想要獲得GPU的計算結果就必須將結果拷貝回CPU。

但是在使用這個函式的時候對它的第一個引數存在一些疑惑,經過查詢資料後做個簡單的總結。

首先cudaMemcpy的第一個引數是void**型別,可以看出是一個指向指標的指標,換一種比較好理解的方式可以說是指標的地址,正常我們定義指標:

float *a;//定義一個指標
a = (float*)malloc(sizeof(float)*size);//分配一定的空間

但是在cuda中我們要用到指標的地址,如果將指標本身當做是一個變數的話,一般函式存在值傳遞和指標傳遞,前者無法改變實參中的值,後者可以通過地址對實參的值進行修改。這裡傳遞指標的地址就相當於指標傳遞,這樣我們就可以改變指標中所指向的地址,因為我們是在主機端建立的指標,而需要它指向GPU中的一塊區域的地址,所以需要改變它所指向的地址。

float *a;
//我們經常會看到這種呼叫方式,對指標的地址進行一個強制轉換
cudaMalloc((float**)&a,sizeof(float)*size);

這裡使用強制轉換的原因,因為有一些c編譯器不支援隱式轉換(c++基本都是支援的),所以在這裡加了使用了強制轉換。