东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[C/C++] cuda并行编程:原子操作atomic之计算直方图,比较了cuda与cpu...

[复制链接]

1366

主题

1857

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14461
QQ
跳转到指定楼层
楼主
发表于 2021-6-15 11:44:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式



cuda并行编程:原子操作atomic之计算直方图,比较了cuda与cpu的时间


  1. #include <stdio.h>
  2. #include <sys/time.h>


  3. __global__ void get_hist(float *a, int *hist)
  4. {
  5.         //块数目 线程数目
  6.         int tid = threadIdx.x;
  7.         int bid = blockIdx.x;
  8.         int idx = tid + bid * blockDim.x;
  9.         //原子操作 加 cuda自带的api  一种锁的机制
  10.         atomicAdd(&hist[(int)a[idx]], 1);
  11. }

  12. //cuda并行编程:原子操作atomic之计算直方图,比较了cuda与cpu的时间
  13. int main()
  14. {
  15.         int size = 32000000;
  16.         float *a = new float[size];

  17.         int length = 10;
  18.         for(int i = 0; i < size; i++)
  19.         {
  20.                 a[i] = i*(i+1) % length;
  21.         }

  22.         int hist[length] = {0};

  23.         float *aGpu;
  24.         cudaMalloc(&aGpu, size * sizeof(float));
  25.         cudaMemcpy(aGpu, a, size * sizeof(float), cudaMemcpyHostToDevice);

  26.         int *histGpu;
  27.         cudaMalloc(&histGpu, length * sizeof(int));
  28.         cudaMemcpy(histGpu, hist, length * sizeof(int), cudaMemcpyHostToDevice);
  29.         // 统计时间
  30.         struct timeval startTime, endTime;
  31.         gettimeofday(&startTime, NULL);
  32.         // get_hist<<<1, size>> >(aGpu, histGpu);
  33.         get_hist<<<size / 512, 512>> >(aGpu, histGpu);
  34.         cudaMemcpy(hist, histGpu, length * sizeof(int), cudaMemcpyDeviceToHost);  //这个比较耗时 相比GPU运算
  35.         gettimeofday(&endTime, NULL);
  36.         printf("gpu计算的结果(次数统计):\n");

  37.         for(int i=0;i<10;i++){
  38.                 printf("%d,", hist[i]);
  39.         }
  40.         printf("cuda use time(单位是微秒): %ld\n",
  41.                 (endTime.tv_sec - startTime.tv_sec)*1000000 + (endTime.tv_usec - startTime.tv_usec));
  42.         //数据清0
  43.         memset(hist, 0, sizeof(hist));
  44.         gettimeofday(&startTime, NULL);
  45.         for(int i = 0; i < size; i++)
  46.         {
  47.                 hist[(int)a[i]] += 1;
  48.         }
  49.         gettimeofday(&endTime, NULL);
  50.         printf("cpu计算的结果(次数统计):\n");
  51.         for(int i=0;i<10;i++){
  52.                 printf("%d,", hist[i]);
  53.         }
  54.         printf("cpu use time: %ld\n",
  55.                 (endTime.tv_sec - startTime.tv_sec)*1000000 + (endTime.tv_usec - startTime.tv_usec));
  56.        

  57.         return 0;
  58. }
复制代码


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

使用道具 举报

0

主题

98

帖子

200

积分

中级会员

Rank: 3Rank: 3

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-1 00:06 , Processed in 0.171454 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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