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++基本都是支援的),所以在這裡加了使用了強制轉換。
相關文章
- 2024.3 總結 2
- CSS技巧總結2CSS
- yii2 總結
- 10.6每日總結2
- 2024暑假總結2
- 每週總結2
- Java——IO總結2Java
- WSL2和CUDA踩坑
- CUDA教學(2):反向傳播反向傳播
- shell學習總結-2
- Vue知識總結(2)Vue
- BGP協議總結(2)協議
- Yii2快速總結
- NODE Stream流總結(2)
- (2)caffe總結之目錄結構
- 執行ps2總結
- MCU CY2BL總結
- 2.MapReduce論文總結
- 架構演化思考總結(2)架構
- 每日總結4月2日
- NODE基礎總結(2) —— Module
- 《三體2:黑暗森林》總結
- iOS開發經驗總結2iOS
- HTTP/2 特性的簡單總結HTTP
- Binder總結篇2-Binder使用
- 常用排序演算法總結(2)排序演算法
- koa2使用注意點總結
- RxJava2 操作符總結RxJava
- koa2入門使用總結
- JS基礎知識總結(2)JS
- 深度學習-在ubuntu16.04安裝CUDA9.1-總結(問題完全解決方案)深度學習Ubuntu
- CUDA
- 【面試總結】記一次失敗的 bilibili 面試總結(2)面試
- UART,I2C,SPI 介面總結
- booststrap select2的應用總結
- yii2 基礎知識總結
- Select2.js錯誤點總結JS
- QTreeView使用總結2,常用API介紹QTViewAPI