找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 42|回复: 2

[求助] openAcc call to cuMemFreeHost returned error 700: Illegal address during kern...

[复制链接]
发表于 5 天前 | 显示全部楼层 |阅读模式
ESC4000G3
本帖最后由 qitongyuan 于 2018-4-15 16:47 编辑

对两个一维数组进行计算的时候用到了OpenAcc并行,但是编译成功后执行可执行文件的时候报了不合法的地址的错误 不添加任何编译指令的时候可以编译也可以执行 不会报错,结果正确!

  1. /**
  2. *计算NDVI
  3. *968行 1535列
  4. **/
  5. void NDVI(Mat redImage,Mat nirImage,Mat ndviImage)
  6. {
  7.         
  8.         cout << "redImage有多少行数 "<<redImage.rows << endl;
  9.         cout << "redImage有多少列数 " << redImage.cols << endl;
  10.         double tstart,tstop,ttime;
  11.         tstart=dtime();

  12.         // 将mat类型数据拷贝到我的定义的二维数组上进行加速运算
  13.         //rows 968 cols 1535
  14.         int width = nirImage.cols;//1535
  15.         int height = nirImage.rows;//968
  16.         uchar *juzhenR = new uchar[height*width];//定义红外二维矩阵
  17.         uchar *juzhenN = new uchar[height*width];
  18.         uchar *juzhenNDVI = new uchar[height*width];
  19.         unsigned char fRed,  fNIR;
  20.         float ndvi;

  21.     //给矩阵赋值
  22.         for(int i=0;i<height;i++)
  23.         {   
  24.                 for(int j=0;j<width;j++)
  25.                 {
  26.                         juzhenR[i*width+j]=redImage.at<uchar>(i,j);
  27.                         juzhenN[i*width +j]=nirImage.at<uchar>(i,j);
  28.                 }
  29.         }
  30.         //先遍历行(这里i表示行 j表示列 怀疑因为数据依赖并行不成)height=rows
  31.     //#pragma acc data copyin(juzhenN,juzhenR) copy(juzhenNDVI)
  32.     //#pragma acc loop collapse(2) independent
  33.     //#pragma acc loop gang(32)
  34.     #pragma acc kernels
  35.     #pragma acc loop independent
  36.     for (int i = 0; i < height; i++)
  37.         {
  38.                 //再遍历列width=cols
  39.                 //#pragma acc loop vector(16)
  40.                 //#pragma acc kernels
  41.                 #pragma acc loop independent
  42.               for (int j = 0; j < width; j++)
  43.                 {
  44.                         //做矩阵运算 ndvi=(fNIR-fRed)/(float)(fNIR+fRed);
  45.                         //先计算矩阵上每个点的ndvi值
  46.                         ndvi=(juzhenN[i * width + j] - juzhenR[i * width + j]) / (float)(juzhenN[i * width + j] + juzhenR[i * width + j]);
  47.                         //将每个值作处理后赋值给矩阵上的点
  48.                         juzhenNDVI[i * width + j] = 127.5*(1 + ndvi);
  49.                         //条件过滤
  50.                         if (juzhenNDVI[i * width + j]<0)
  51.                         {
  52.                                 juzhenNDVI[i * width + j] = 0;
  53.                         }
  54.                         if (juzhenNDVI[i * width + j]>255)
  55.                         {
  56.                                 juzhenNDVI[i * width + j] = 255;
  57.                         }
  58.                 }

  59.         }
  60.         tstop=dtime();
  61.         ttime=tstop-tstart;
  62.         printf("runningtime %f(s)\n",ttime);
  63.         //将juzhenNDVI赋值给Mat ndviImage
  64.         Mat ndvijuzhen(height, width, CV_8UC1, (uchar *)juzhenNDVI);
  65.         ndvijuzhen.copyTo(ndviImage);
  66. }

复制代码

在代码中38和44行的地方进行并行,编译。
编译结果: 1.png
运行结果: 2.png
本人需要用openacc 并行计算OpenCV读入的一个图片 因为OpenCV的mat类过于复杂于是将其简化为一维数组 逻辑上的2维数组进行计算
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
Jetson TX2
我们工程师跑了一下代码,按照这样写就对了:
QQ图片20180417103308.png

至于原来的写法为什么会报错,就得分析生成的gpu代码了
回复 支持 反对

使用道具 举报

 楼主| 发表于 3 天前 | 显示全部楼层
Tesla P100
sisiy 发表于 2018-4-17 10:52
我们工程师跑了一下代码,按照这样写就对了:

谢谢! 确实可以跑起来了 应该是我添加指令的时候动态生成数组,必须将数据拷贝到GPU上
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

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