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. };  

相关阅读:

相关推荐