歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

CUDA+Vector測試程序

CUDA+Vector測試程序:

  1. /* 
  2. * Copyright 徐洪志(西北農林科技大學.信息工程學院).  All rights reserved. 
  3. * Data: 2012-4-15 
  4. */  
  5. //   
  6. // 此程序是演示了vector型數據如何拷貝入、出顯存   
  7. #include <cutil_inline.h>   
  8.   
  9. #include <iostream>   
  10. #include <vector>   
  11. using namespace std;  
  12.   
  13.   
  14. ///////////////////////////////////////////////////////////////////////////////////////////   
  15. //   
  16. // MAIN   
  17. //   
  18. ///////////////////////////////////////////////////////////////////////////////////////////   
  19. int main(int argc, char** argv)  
  20. {  
  21.     CUT_DEVICE_INIT(argc, argv);  // 啟動CUDA   
  22.     int row, col;  
  23.     /// Vector-->Device-->Host  1D   
  24.     cout << "Vector-->Device-->Host 1D" << endl;  
  25.     vector<int> vec;  // Host端vector   
  26.     int *gpu_data;    // Device端data   
  27.     int *cpu_data;    // Host端data   
  28.     int dataWd = 20;  
  29.     cpu_data = (int*)calloc(dataWd, sizeof(int));  // 申請內存空間   
  30.     cutilSafeCall( cudaMalloc((void**) &gpu_data, sizeof(int) * dataWd));  // 申請顯存空間   
  31.     cutilSafeCall( cudaMemset(gpu_data, 0, sizeof(float) * dataWd));  
  32.     if((cpu_data == NULL)||(gpu_data == NULL))   // 判斷空間是否申請成功   
  33.     {     
  34.         cout << "Alloc Memery Error" << endl;  
  35.         return -1;  
  36.     }  
  37.     for(row = 0; row < dataWd; ++row)   // 給Host端的vector初始化   
  38.         vec.push_back(row);  
  39.     cutilSafeCall( cudaMemcpy(gpu_data, &vec[0] , sizeof(int) * dataWd, cudaMemcpyHostToDevice));  // 將Host端vector拷貝入Device端data   
  40.     cutilSafeCall( cudaMemcpy(cpu_data, gpu_data, sizeof(int) * dataWd, cudaMemcpyDeviceToHost));  // 將Device端data拷貝入Host端data   
  41.   
  42.     for(row = 0; row < dataWd; ++row)   // 打印Host端data   
  43.         cout << cpu_data[row] << " ";  
  44.     cout << endl;  
  45.       
  46.     cutilSafeCall( cudaFree(gpu_data));  // 釋放顯存空間   
  47.     free(cpu_data);                      // 釋放內存空間   
  48.   
  49.     /// vector-->Device-->Host  2D   
  50.     cout << "Vector-->Device-->Host 2D" << endl;  
  51.     vector< vector<int> > vec2D;  // Host端vector   
  52.     int *cpu_data2D;              // Host端data   
  53.     int *gpu_data2D;              // Device端data   
  54.     size_t pitch;                 // 字節對齊   
  55.     int Wd = 10;               // 寬度   
  56.     int Ht = 5;                // 高度   
  57.   
  58.     cutilSafeCall( cudaMallocPitch((void**) &gpu_data2D, &pitch, sizeof(int) * Wd, Ht));  // 申請顯存空間   
  59.     cutilSafeCall( cudaMemset2D(gpu_data2D, pitch, 0, sizeof(int)*Wd, Ht));               // 顯存空間初始化   
  60.     cpu_data2D = (int*)calloc(Wd * Ht, sizeof(int));                                      // 申請內存空間   
  61.     if((cpu_data2D == NULL)||(gpu_data2D == NULL))   // 判斷空間是否申請成功   
  62.     {  
  63.         cout << "Alloc Memery Error" << endl;  
  64.         return -1;  
  65.     }  
  66.     for(row = 0; row < Ht; ++row)   // 初始化Vector   
  67.     {  
  68.         vector<int> temp;  
  69.         for(col = 0; col < Wd; ++col)  
  70.         {  
  71.             temp.push_back(row+col);  
  72.         }  
  73.         vec2D.push_back(temp);  
  74.         temp.clear();  
  75.     }  
  76.     cout << "Vetor2D" << endl;  
  77.     for(row = 0; row < Ht; ++row)  
  78.     {  
  79.         for(col = 0; col < Wd; ++col)  
  80.             cout << vec2D[row][col] << " ";  
  81.         cout << endl;  
  82.     }  
  83.     // 將vector中的數據拷貝到Device端data   
  84.     for(row = 0; row < Ht; ++row)  
  85.     {  
  86.         cutilSafeCall( cudaMemcpy(&gpu_data2D[row*(pitch/sizeof(int))], &vec2D[row][0], sizeof(int)*Wd, cudaMemcpyHostToDevice));  
  87.     }  
  88.     // 將Device端data拷貝到Host端data   
  89.     cutilSafeCall( cudaMemcpy2D( cpu_data2D, sizeof(int) * Wd, gpu_data2D, pitch, sizeof(int) * Wd, Ht, cudaMemcpyDeviceToHost));     
  90.     cout << "cpu_data2D" << endl;   // 打印Host端data   
  91.     for(row = 0; row < Ht; ++row)  
  92.     {  
  93.         for(col = 0; col < Wd; ++col)  
  94.         {  
  95.             cout << cpu_data2D[row*Wd + col] << " ";  
  96.         }  
  97.         cout << endl;  
  98.     }  
  99.     cutilSafeCall( cudaFree(gpu_data2D));     // 釋放顯存空間   
  100.     free(cpu_data2D);                         // 釋放內存空間   
  101.     CUT_EXIT(argc, argv);   // 退出CUDA   
  102. };  

相關閱讀:

Ubuntu 11.10 上安裝CUDA開發環境  http://www.linuxidc.com/Linux/2012-04/58913.htm

Ubuntu 11.04 安裝 NVIDIA CUDA 4.0 RC2 http://www.linuxidc.com/Linux/2011-10/46304.htm

Copyright © Linux教程網 All Rights Reserved