CUDA總結2——cudaMemcpy
在使用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++基本都是支援的),所以在這裡加了使用了強制轉換。
相關文章
- CUDA面記憶體用法總結記憶體
- CUDA總體優化策略優化
- 工作總結2
- CUDA SDK例子分析(2):transpose
- yii2 總結
- Java——IO總結2Java
- CSS技巧總結2CSS
- [php]php總結(2)PHP
- 每週總結2
- WSL2和CUDA踩坑
- CUDA教學(2):反向傳播反向傳播
- Yii2快速總結
- shell學習總結-2
- Vue知識總結(2)Vue
- BGP協議總結(2)協議
- NODE Stream流總結(2)
- Java面試題總結2Java面試題
- 學習心得總結(2)
- ORACLE壞塊總結2Oracle
- 2周的面試總結面試
- RMAN 總結篇 2 - (轉)
- Struts2總結薦
- 10.6每日總結2
- (2)caffe總結之目錄結構
- CLUSTER內部結構的總結(2)
- 【CUDA學習】GPU硬體結構GPU
- 《三體2:黑暗森林》總結
- 執行ps2總結
- NODE基礎總結(2) —— Module
- C#常用集合總結-2C#
- java基礎部分總結2Java
- 面試總結-百度(2)面試
- 數論學習總結2
- Maven2安裝總結Maven
- struts2標籤總結
- 實習2天的總結
- Oracle DBA手記2總結Oracle
- MCU CY2BL總結