Ubuntu 9.04下CUDA編程起步

來源:互聯網
上載者:User

前一陣子把蟻群演算法和改進的K-Means演算法都搞定了,然後一直在看CUDA編程,前面看CUDA的介紹,一直認為會C之後CUDA就很容易上手,其實不然,還需要瞭解一些GPU的體繫結構相關的知識才能寫出好的程式來。《GPU高效能運算之CUDA》這本書看完一遍之後感覺它更像一個手稿整理,把之前的恒多文檔整理了一下出了一本書,因為是集大家的智慧,講的還不錯,就是順序上安排的不是太好。有總比沒有好,看過一遍之後,對CUDA編程還是有一些底氣的。推薦新手也先看看。

  看書歸看書,寫程式是另外一件事情,上一篇文章裡把環境搭建起來了,可是我還是不知道怎麼建立CUDA工程,怎麼動手開始寫程式。還好CUDA提供了一個SDK,裡面有很多的執行個體可以供我們參考,於是乎,我的第一個CUDA程式就從這裡開始了。

  CUDA SDK的執行個體都在src目錄下,每一個執行個體都有一個自己的目錄,例如deviceuery,在它的目錄下還有一個編譯時間候使用的Makefile檔案,這是編譯單個項目的。現在我們將所有執行個體都編譯一遍,在CUDA_SDK根目錄下運行sudo make之後,可以在 <CUDA_SDK_HOME>/bin/linux/release下看到編譯之後的可執行程式,運行即可看到結果。

  這是deviceQuery的運行結果:

  

  那麼到這裡相信讀者應該想到了我們完全可以利用這些執行個體來建立我們自己的工程。再執行個體中有一個template,將該目錄下src中的.cu、.cpp檔案刪除,將obj目錄下的內容清空,這就成為一個空的CUDA工程,可以再src下編寫程式,然後在Makefie中將編譯的檔案名稱修改正確,編譯即可。所產生的執行檔案在CUDA_SDK_HOME/bin/linux/release下。這裡是一個測試代碼,執行矩陣加法運算的:

  1 #include <stdio.h>

  2 #include <stdlib.h>

  3 #include <time.h>

  4 #include <cuda_runtime.h>

  5 #include <cutil.h>

  6

  7 #define VEC_SIZE 16

  8

  9 //kernel function

  10 __global__ void vecAdd(float* d_A,float* d_B,float* d_C)

  11 {

  12  int index=threadIdx.x;

  13 d_C[index]=d_A[index]+d_B[index];

  14 }

  15

  16 int main()

  17 {

  18 //得到分配空間的大小

  19 size_t size=VEC_SIZE*sizeof(float);

  20

  21 //為本地分配記憶體

  22 float* h_A=(float*)malloc(size);

  23 float* h_B=(float*)malloc(size);

  24 float* h_C=(float*)malloc(size);

26 //初始化

  27 for (int i=0;i<VEC_SIZE;++i)

  28 {

  29 h_A[i]=1.0;

  30 h_B[i]=2.0;

  31 }

  32

  33 //將本地記憶體的中的資料複製到裝置中

  34 float* d_A;

  35 cudaMalloc((void**)&d_A,size);

  36 cudaMemcpy(d_A,h_A,size,cudaMemcpyHostToDevice);

  37

  38 float* d_B;

  39 cudaMalloc((void**)&d_B,size);

  40 cudaMemcpy(d_B,h_B,size,cudaMemcpyHostToDevice);

  41

  42 //分配存放結果的空間

  43 float* d_C;

  44         cudaMalloc((void**)&d_C,size);

  45

  46         //定義16個線程

  47         dim3 dimblock(16);

  48         vecAdd<<<1,dimblock>>>(d_A,d_B,d_C);

  49

  50         //講計算結果複製回主存中

  51         cudaMemcpy(h_C,d_C,size,cudaMemcpyDeviceToHost);

  52

  53         //輸出計算結果

  54         for (int j=0;j<VEC_SIZE;++j)

  55         {

  56                printf("%f\t",h_C[j]);

  57         }

  58

  59         //釋放主機和裝置記憶體

  60         cudaFree(d_A);

  61         cudaFree(d_B);

  62         cudaFree(d_C);

  63

  64         free(h_A);

  65         free(h_B);

  66         free(h_C);

  67

  68         return 0;

  69 }

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.