GPU編程入門(二)

  1. 核函數
    kernel<<m,n>>();
    其中m表示CUDA運行時需要啓動的block,n表示每個block中創建的線程數量,啓動的總線程數爲m*n;
    一個Grid對應一個kernel<<<m,n>>>,通過這種形式可以完成目標線程的索引。
  2. 修飾符:_global _,含義:告知編譯器,函數應該在device 編譯,而不在host上。且必須注意—global—函數的返回值必須是void。
  3. cudaMalloc((void**)&dev_c, sizeof(int))函數,告知CUDA在運行時在device上分配內存。(void**)&dev_c指針表示指向用於保存新分配內存地址的變量,sizeof(int)表示內存的大小。
  4. cudaFree()每次程序結束後,需要通過這個函數釋放分配的內存。
  5. device與host之間的訪問,參數的傳遞:cudaMemcpy(dst_a,src_a,sizeof(int),cudaMencpyDeviceToHost),最後一個參數代表參數傳遞的方向。
    因此傳遞的方向可以是:
參數 方向
cudaMencpyHostToDevice CPU TO GPU
cudaMencpyDeviceToHost GPU TO CPU
cudaMencpyDeviceToDevice GPU TO GPU
  1. 線程協作
    對於kernel<<m,n>>();,參數m和n的大小都有一定的限制(來自硬件的限制)。m即block的數量不超過65535,n即一個block中thread的數量不超過512。因此對於矢量求和時,若矢量長度小於512可以調用int tid = threadIdx.x;對於長度小於65535的矢量可以調用int tid = blockIdx.x,但長度位於512–65535,也可以調用int tid = threadIdx.x + blockIdx.x*blockDim.x進行計算。
    上面的blockDim.x是一個常量,表示block其中一維的線程數量,類似的變量還有gridDim.x,代表grid每一維的block數量。其中,gridDim.x是2D的,blockDim.x是3D的。這種三維索引好像適合計算圖像像素之間的運算)
    grid 和block通過dim3類定義,dim3可以看成包含3個無符號整數(x, y, z)的結構體變量,在定義是缺省值初始化爲1。
    1. 瞭解硬件架構
      通過上述簡單概念對GPU和CUDA有一個簡單的認識之後,需要了解GPU的硬件架構,如果需要設計一個高性能的並行程序,必然要對GPU的計算過程有一個詳細的瞭解。用圖說話
      引https://www.cnblogs.com/1024incn/p/4539754.html
      引https://www.cnblogs.com/skyfsm/p/9673960.html
      SP是GPU的基本處理單元,kernel啓動後,thread即被分配到SP上。負責運行線程上的程序。
      SM:多處理器,包含SP以及其他一些硬件結構(如:register, local memory(thread私有的), shared memory(block,global memory(共享,都可訪問))等
    2. 編程模型
      SIMD(Single Instruction Multiple Data), 針對GPU—SIMT(Single Instruction Multiple Thread)
      編程模式:使用擴展的C語言,多了一些關鍵詞,內置的變量,一些API函數,函數調用形式等
      CUDA函數聲明:
執行位置 調用位置
_device_float DeviceFunc() device device
_global_void KernelFunc() device host
_host_float HostFunc() host host
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章