Cuda编程学习(一)
生活随笔
收集整理的這篇文章主要介紹了
Cuda编程学习(一)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用Cuda進行GPU編程 ——GPU高性能編程Cuda實戰? ? 第四章C并行編程總結 開始學習Cuda和GPU編程的相關知識啦。 感覺GPU編程會越來越重視,尤其是在移動端的計算復雜度優化方面。掌握GPU編程,以后實習找工作也會方便很多。 最近一有時間就會學習GPU高性能編程Cuda實戰這本書,也會寫一些總結發表到博客里。 期望是:摸熟GPU這一領域,這是以前從來沒接觸過得地方;通過使用Cuda進行優化三維重建的項目,為簡歷填上一筆硬通貨。 Cuda的思想是: 按照類似于CPU的方法,對GPU提供通用計算的編程界面。 CPU的計算體系是: 在程序中運行的指令和臨時變量,一般是保存在內存中的。CPU把數據從內存中取出來計算,再存入到內存中。 簡要來說兩個部分:數據的存儲和計算。 GPU類似于CPU,只不過有更多的算術邏輯處理單元,更適合采用并行處理的算法來解決問題。 在考慮時,把GPU與CPU類似考慮,區別在于: 1.? ? 內存位置的不同。 2.? ? 計算方式的不同。 ?
1.? ? 內存位置的不同:
變量存儲在內存中,其物理地址,有的對應的是CPU的內存,有的是對應GPU的內存。(方便起見,暫時不考慮CPU的高速緩存機制) 放在CPU內存中的數據,只能被CPU讀寫;放在GPU內存中的數據,只能被GPU讀寫。 當然可以通過CudaMemcpy的方式,把CPU內存中的數據與GPU內存總的數據做交換。 考慮CPU和GPU的區別時,把CPU和CPU對應的內存當做主機,而GPU和GPU對應的內存當做設備device 在CPU中聲明一個指針的方法是: int *a = new int[10]; 這樣a就對應著CPU內存中一個長度為10的int數組的首地址 在GPU中分配內存則是: int *dev_a; cudaMalloc( (void **) &dev_a, 10 * sizeof(int) ); dev_a是一個指針,指向一段int型數組的首地址; &dev_a 是 指向dev_a的指針,通過cudaMalloc的函數,可以改變dev_a指向的位置。 分配完空間之后,dev_a指向的也就是GPU內存中一段int型數組的首地址。2.? ? 計算方式的不同
在GPU中執行的函數被稱為核函數, 使用如下:kernel<<<1,1>>>>(params); 舉例來說: 聲明GPU的函數,需要用如下的方式: __global __ void add(int *a, int *b){???? } 使用時,add<<<N,1>>>(dev_a, dev_b); 聲明為global函數之后,才可以在主機上調用。 第一個參數表示,設備在執行核函數時使用的并行線程塊的數量。在函數中,可以通過blockIdx.x獲得當前線程塊的id (備注:cuda可以支持二維索引,通過grid實現) 簡單的并行處理就可以通過調用add函數來完成了。 不過真正的并行處理,還需要考慮到不同線程之間的通信、同步情況,這些內容留著學習下一章的時候再做介紹吧。轉載于:https://www.cnblogs.com/leohan2013/p/3285143.html
總結
以上是生活随笔為你收集整理的Cuda编程学习(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 统计_statistics_不同的人_大
- 下一篇: Ts 的类