免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 图腾部落
打印 上一主题 下一主题

[C] CUDA编程-趣味小竞赛(获奖名单公布4月2日) [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-01-26 13:52 |只看该作者
关注一下

论坛徽章:
80
20周年集字徽章-庆
日期:2020-10-28 14:09:1215-16赛季CBA联赛之北京
日期:2020-10-28 13:32:5315-16赛季CBA联赛之北控
日期:2020-10-28 13:32:4815-16赛季CBA联赛之天津
日期:2020-10-28 13:13:35黑曼巴
日期:2020-10-28 12:29:1520周年集字徽章-周	
日期:2020-10-31 15:10:0720周年集字徽章-20	
日期:2020-10-31 15:10:07ChinaUnix元老
日期:2015-09-29 11:56:3020周年集字徽章-年
日期:2020-10-28 14:14:56
12 [报告]
发表于 2010-01-28 11:03 |只看该作者
支持一下,

论坛徽章:
0
13 [报告]
发表于 2010-02-01 20:54 |只看该作者
不会CUDA,

CUDA怎么跟BEOWULF一起运行呢?

论坛徽章:
0
14 [报告]
发表于 2010-02-03 15:18 |只看该作者
本帖最后由 starfuck 于 2019-11-26 23:38 编辑












论坛徽章:
0
15 [报告]
发表于 2010-02-03 15:59 |只看该作者
本帖最后由 starfuck 于 2019-11-26 23:38 编辑












论坛徽章:
0
16 [报告]
发表于 2010-02-03 17:10 |只看该作者
看看,并行算法。

论坛徽章:
0
17 [报告]
发表于 2010-02-17 15:50 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
18 [报告]
发表于 2010-02-20 06:48 |只看该作者
大牛哪去了~~~

论坛徽章:
0
19 [报告]
发表于 2010-02-22 11:13 |只看该作者
有没有cuda入门帖啊?

论坛徽章:
0
20 [报告]
发表于 2010-02-22 15:27 |只看该作者
本帖最后由 Posix_man 于 2010-03-04 12:53 编辑



呵呵,很少人参与啊!

我来玩玩。希望能抛砖引玉。

可惜没n家的卡,也懒得装驱动和环境,所以麻烦哪位有此环境的兄弟或姐妹,帮我把代码编译运行一次,看看有什么错误。

cuda的资料只看了一点,所以先做题目一。
  1. #include <iostream>
  2. #include <string>
  3. #include <time.h>

  4. typedef struct {
  5. int width;
  6. int height;
  7. float* elements;
  8. } myMatrix;

  9. // for single device
  10. int activeDevice=-1;
  11. int maxBlockSize=0;

  12. //for mulit device
  13. int deviceCount=-1;
  14. int gpuCount=0;
  15. int blockSize=0;

  16. // Forward declaration of the matrix multiplication kernel
  17. __global__ void MatMulKernel(const Matrix, const Matrix, Matrix);
  18. // Matrix multiplication - Host code
  19. // Matrix dimensions are assumed to be multiples of BLOCK_SIZE

  20. int main(){
  21.        
  22.         //iniatlize.....
  23.         cudaDeviceProp deviceProp;
  24.         cudaGetDeviceCount(&deviceCount);
  25.         for (int device = 0; device < deviceCount; ++device) {               
  26.                 cudaGetDeviceProperties(&deviceProp, device);
  27.                 if ((device == 0)&&(deviceProp.major == 9999) &&( deviceProp.minor == 9999)){
  28.                                 std::cout<<"There is no device supporting CUDA. See you!\n";
  29.                                 return -1;
  30.                 }
  31.                 if(deviceProp.computeMode == cudaComputeModeDefault)
  32.                         activeDevice=device;
  33.                 else{
  34.                         if(cudaSetDevice(device) == cudaErrorSetOnAcitveProcess)
  35.                                 continue;
  36.                 }

  37.                 gpuCount += deviceProp.multiProcessorCount;
  38.                 if (blockSize==0)
  39.                         blockSize= deviceProp.maxThreadsPerBlock;
  40.                 else
  41.                         blockSize = deviceProp.maxThreadsPerBlock < blockSize ? deviceProp.maxThreadsPerBlock : blockSize;

  42.                 activeDevice = deviceProp.maxThreadsPerBlock > maxBlockSize ? device : activeDevice;
  43.                 maxBlockSize = deviceProp.maxThreadsPerBlock > maxBlockSize ? deviceProp.maxThreadsPerBlock : maxBlockSize;
  44.                
  45.         }

  46.         if(activeDevice == -1){
  47.                 std::cout << "There is no available CUDA device. See you!\n";
  48.                 return -1;
  49.         }

  50.         //set the device on
  51.         if(cudaSetDevice(activeDevice) == cudaErrorSetOnAcitveProcess){
  52.                 std::cout << "There is no available CUDA device. See you!\n";
  53.                 return -1;
  54.         }
  55.                
  56.         //get inputs of matrix A and B.
  57.         myMatrix mA,mB,mC;
  58.         std::cout <<"\n\tPlease input the width of matrix A !";
  59.         std::cin >> mA.width;
  60.         std::cout <<"\n\tPlease input the height of matrix A !";
  61.         std::cin >> mA.height;
  62.         mA.elements= new float[mA.width * mA.height];

  63.         for(int i=0;i < mA.width;i++){
  64.                 for(int j=0; j < mA.height;j++){
  65.                         std::cout<< "\nPlease input Matrix A ["<< i <<"][" << j << "] :";
  66.                         std::cin >> mA.elements[i][j];
  67.                 }
  68.         }
  69.     std::cout<<"Matrix A is done!\n";

  70.         std::cout <<"\n\tPlease input the width of matrix B !";
  71.         std::cin >> mB.width;
  72.         std::cout <<"\n\tPlease input the height of matrix B !";
  73.         std::cin >> mB.height;
  74.         mB.elements= new float[mB.width * mB.height];

  75.         for(int i=0;i < mB.width;i++){
  76.                 for(int j=0; j < mB.height;j++){
  77.                         std::cout<< "\nPlease input Matrix B ["<< i <<"][" << j << "] :";
  78.                         std::cin >> mB.elements[i][j];
  79.                 }
  80.         }
  81.     std::cout<<"Matrix B is done!\n";

  82.         mC.width=mB.width;
  83.         mC.height=mA.height;
  84.         mC.elements= new float[mC.width * mC.height];

  85.         clock_t t1=clock();
  86.         MatrixMul4OneDev(mA,mB,mC);
  87.        
  88.         std::cout<<"This matrix is done in "<< clock()-t1 <<" ticks!\n";

  89.         for(int i=0;i< mC.width * mC.height;i++){
  90.                 if(i % mC.width ==0 )
  91.                 std::cout << "\n";
  92.                 std::cout << mC.elements[i] << " ";
  93.         }

  94.         delete [] mA.elements;
  95.         delete [] mB.elements;
  96.         delete [] mC.elements;
  97.         return mC.width * mC. height;
  98. }

  99. void MatrixMul4OneDev(const myMatrix& A, const myMatrix& B, myMatrix& C)
  100. {
  101.         Matrix d_A;
  102.         d_A.width = A.width; d_A.height = A.height;
  103.         size_t size = A.width * A.height * sizeof(float);
  104.         cudaMalloc((void**)&d_A.elements, size);
  105.         cudaMemcpy(d_A.elements, A.elements, size,cudaMemcpyHostToDevice);
  106.        
  107.         Matrix d_B;
  108.         d_B.width = B.width; d_B.height = B.height;
  109.         size = B.width * B.height * sizeof(float);
  110.         cudaMalloc((void**)&d_B.elements, size);
  111.         cudaMemcpy(d_B.elements, B.elements, size,cudaMemcpyHostToDevice);
  112.        
  113.         Matrix d_C;
  114.         d_C.width = C.width; d_C.height = C.height;
  115.         size = C.width * C.height * sizeof(float);
  116.         cudaMalloc((void**)&d_C.elements, size);

  117.     dim3 dimBlock(maxBlockSize/2,maxBlockSize/2);
  118.         dim3 dimGrid(B.width / dimBlock.x, A.height / dimBlock.y);
  119.         MatMulKernel<<<dimGrid, dimBlock>>>(d_A, d_B, d_C);
  120.         // Read C from device memory
  121.         cudaMemcpy(C.elements, Cd.elements, size,cudaMemcpyDeviceToHost);
  122.         // Free device memory
  123.         cudaFree(d_A.elements);
  124.         cudaFree(d_B.elements);
  125.         cudaFree(d_C.elements);
  126. }

  127. __global__ void MatMulKernel(myMatrix A, myMatrix B, myMatrix C)
  128. {
  129.     float Cvalue = 0;
  130.         int row = blockIdx.y * blockDim.y + threadIdx.y;
  131.         int col = blockIdx.x * blockDim.x + threadIdx.x;
  132.         for (int e = 0; e < A.width; ++e)
  133.                 Cvalue += A.elements[row * A.width + e]* B.elements[e * B.width + col];
  134.         C.elements[row * C.width + col] = Cvalue;
  135. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP