东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[C/C++] cuda动态共享内存与报错调试HandleError

[复制链接]

1366

主题

1857

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

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


cuda动态共享内存与报错调试HandleError
如果你想在一个核函数中动态地申请多个数组时该怎么办呢?看附件的图片



  1. #include <stdio.h>
  2. #define N   10
  3. #define HANDLE_ERROR( err ) (HandleError( err, __FILE__, __LINE__ ))
  4. static void HandleError( cudaError_t err,
  5.                          const char *file,
  6.                          int line ) {
  7.     if (err != cudaSuccess) {
  8.         printf( "%s in %s at line %d\n", cudaGetErrorString( err ),
  9.                 file, line );
  10.         exit( EXIT_FAILURE );
  11.     }
  12. }

  13. __global__ void add( int *a, int *b, int *c ) {
  14.     int tid = threadIdx.x;    // this thread handles the data at its thread id
  15.     //使用了未指定大小的extern数组语法来声明共享内存数组
  16.     //注意中括号与extern说明符
  17.     //当核函数被启动时,数组大小从第三个执行配置参数被隐式地确定
  18.     extern __shared__ int sh[];  // cuda动态共享内存的申明
  19.     int *x = (int *)sh;      //动态内存的大小在调用时候的 第三个参数上
  20.    
  21.     if (tid >= N)
  22.         return;
  23.     x[tid] = a[tid] + b[tid];
  24.     // 这里用共享内存是多此一举 为了展示用法而已
  25.     c[tid] = x[tid];
  26. }

  27. //cuda动态共享内存与报错调试HandleError
  28. //如果你想在一个核函数中动态地申请多个数组时该怎么办呢?看附件的图片

  29. int main( void ) {
  30.     int a[N], b[N], c[N];
  31.     int *dev_a, *dev_b, *dev_c;

  32.     // allocate the memory on the GPU
  33.     HANDLE_ERROR( cudaMalloc( (void**)&dev_a, N * sizeof(int) ) );
  34.     HANDLE_ERROR( cudaMalloc( (void**)&dev_b, N * sizeof(int) ) );
  35.     HANDLE_ERROR( cudaMalloc( (void**)&dev_c, N * sizeof(int) ) );

  36.     // fill the arrays 'a' and 'b' on the CPU
  37.     for (int i=0; i<N; i++) {
  38.         a[i] = -i;
  39.         b[i] = i * i;
  40.     }

  41.     // copy the arrays 'a' and 'b' to the GPU
  42.     HANDLE_ERROR( cudaMemcpy( dev_a, a, N * sizeof(int),
  43.                               cudaMemcpyHostToDevice ) );
  44.     HANDLE_ERROR( cudaMemcpy( dev_b, b, N * sizeof(int),
  45.                               cudaMemcpyHostToDevice ) );
  46.     //cuda共享内存的动态分配 这里有三个参数:block_num,thread_num,共享内存大小
  47.     //每个线程块中共享内存的大小必须在核函数第三个执行配置参数中指定(以字节为单位)
  48.     add<<<1,N,N>>>( dev_a, dev_b, dev_c );

  49.     // copy the array 'c' back from the GPU to the CPU
  50.     HANDLE_ERROR( cudaMemcpy( c, dev_c, N * sizeof(int),
  51.                               cudaMemcpyDeviceToHost ) );

  52.     // display the results
  53.     for (int i=0; i<N; i++) {
  54.         printf( "%d + %d = %d\n", a[i], b[i], c[i] );
  55.     }

  56.     // free the memory allocated on the GPU
  57.     HANDLE_ERROR( cudaFree( dev_a ) );
  58.     HANDLE_ERROR( cudaFree( dev_b ) );
  59.     HANDLE_ERROR( cudaFree( dev_c ) );

  60.     return 0;
  61. }
复制代码


cuda_动态共享内存.png (75.61 KB, 下载次数: 87)

cuda_动态共享内存.png
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

0

主题

98

帖子

200

积分

中级会员

Rank: 3Rank: 3

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-28 14:04 , Processed in 0.187839 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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