东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 1202|回复: 1
打印 上一主题 下一主题

[C/C++] cuda编程:完整cuda程序的七大步骤

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14439
QQ
跳转到指定楼层
楼主
发表于 2021-6-7 17:20:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式



cuda编程:完整cuda程序的七大步骤:
1、设置显卡设备
2、分配显存空间
3、从内存拷贝数据到显存
4、执行并行操作(cuda的优势)
5、从显存拷贝结果到内存
6、释放显存空间
7、设备重置
如果是单GPU可以省掉1和7步骤



  1. #include <iostream>

  2. using namespace std;


  3. __global__ void kernelFunc(float *a){
  4.     a[threadIdx.x] = 1;
  5. }

  6. int main(){
  7.     int gpuCount = -1;
  8.     cudaGetDeviceCount(&gpuCount);
  9.     printf("本机GPU的数量=%d\n",gpuCount);
  10.     if(gpuCount < 1){
  11.         printf("本机没有GPU设备!退出程序!\n");
  12.         return 0;
  13.     }
  14.    
  15.     cout << "1、设置显卡设备" << endl;
  16.     cudaSetDevice(gpuCount-1);
  17.    
  18.     int device_id;
  19.     cudaGetDevice(&device_id);
  20.     printf("看一下设备是否设置成功?device_id=%d\n",device_id);
  21.     //可以查看当前GPU设备的信息
  22.     cudaDeviceProp prop;
  23.     cudaGetDeviceProperties(&prop, device_id);
  24.     printf("设备名字=%s\n", prop.name);
  25.     printf("maxThreadsPerBlock=%d\n", prop.maxThreadsPerBlock);
  26.     printf("maxThreadsDim[0]=%d\n", prop.maxThreadsDim[0]);
  27.     printf("maxGridSize[0]=%d\n", prop.maxGridSize[0]);
  28.     printf("totalConstMem=%ld\n", prop.totalConstMem);
  29.     printf("totalGlobalMem=%ld\n", prop.totalGlobalMem);
  30.     printf("compute capability算力=%d.%d\n", prop.major, prop.minor);
  31.     printf("clockRate=%d\n", prop.clockRate);
  32.     printf("是否集成显卡integrated=%d\n", prop.integrated);

  33.     float *aGpu;  // gpu上的数组指针
  34.     cout << "2、分配显存空间" << endl;
  35.     cudaMalloc(&aGpu, 16*sizeof(float));
  36.     float a[16] = {0};  //内存空间 分配了
  37.     cout << "3、从内存拷贝数据到显存" << endl;
  38.     cudaMemcpy(aGpu, a, 16*sizeof(float), cudaMemcpyHostToDevice);
  39.     cout << "4、执行并行操作(cuda的优势)" << endl;
  40.     //<<<blockNum, threadNum>> >
  41.     kernelFunc<<<1, 16>>>(aGpu);   // 1个block   16个线程
  42.     cout << "5、从显存拷贝结果到内存" << endl;
  43.     cudaMemcpy(a, aGpu, 16*sizeof(float), cudaMemcpyDeviceToHost);
  44.     //打印一下看看是否修改了?
  45.     for (int i =0; i<16;i++){
  46.         printf("%f ", a[i]);
  47.     }
  48.     printf("\n");
  49.     cout << "6、释放显存空间" << endl;
  50.     cudaFree(aGpu);
  51.     cout << "7、设备重置" << endl;
  52.     cudaDeviceReset();

  53.     return 0;
  54. }


复制代码




  1. CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
  2. PROJECT(jiang)
  3. SET(CMAKE_CXX_FLAGS "-std=c++11")
  4. FIND_PACKAGE(CUDA REQUIRED)
  5. CUDA_ADD_EXECUTABLE(jiang main.cu)
  6. TARGET_LINK_LIBRARIES(jiang)
复制代码




  1. 本机GPU的数量=1
  2. 1、设置显卡设备
  3. 看一下设备是否设置成功?device_id=0
  4. 设备名字=GeForce RTX 2070
  5. maxThreadsPerBlock=1024
  6. maxThreadsDim[0]=1024
  7. maxGridSize[0]=2147483647
  8. totalConstMem=65536
  9. totalGlobalMem=8366784512
  10. compute capability算力=7.5
  11. clockRate=1620000
  12. 是否集成显卡integrated=0
  13. 2、分配显存空间
  14. 3、从内存拷贝数据到显存
  15. 4、执行并行操作(cuda的优势)
  16. 5、从显存拷贝结果到内存
  17. 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
  18. 6、释放显存空间
  19. 7、设备重置
复制代码




让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

0

主题

98

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
沙发
发表于 2021-11-23 19:41:16 | 只看该作者
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-5-19 14:01 , Processed in 0.170916 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表