最新帖子

页: [1] 2 3 ... 10
1
OpenCL / 请教一个关于abs求值的问题
« 最后发表 作者 ljyoicqn 十一月 11, 2023, 11:42:01 pm »
我在OpenCL中实现了一个关于对unsigned char类型的数据进行求绝对值累加和的计算过程,但是在计算过程中出现了一个比较奇怪的问题,也可能是我经验不足,请大家帮忙看看这是什么情况。
我的PC端的代码是
   int* pOut_Multi = new int[1280 * 1280];
   memset(pOut_Multi, 0, sizeof(int) * 1280 * 1280);
   int idx_o = 0;
   for (int r = 0; r < (1600 - 512 + 1); r++)
   {
      if( r%10==0)std::cout << "r = " << r << std::endl;
      for (int c = 0; c < (1600 - 512 + 1); c++)
      {
         for (int r_real = 0; r_real < 512; r_real++)
         {
            for (int c_real = 0; c_real < 512; c_real++)
            {
               pOut_Multi[idx_o] += abs(126-abs(pReal[r_real*512+c_real]-pBase[(r+r_real)*1600+c+c_real]) );
            }
         }
         idx_o++;
      }
   }
我的OpenCL代码是:
__kernel void __FullMatch(__global unsigned char* pBase, __global unsigned char* pReal, __global unsigned char* pMask,
             __global int* out, const int w, const int h, const int w_base)
 {
   __local int r, c;
   __local int idx;
   __local int idx_base;
   __local int offset;
   __local int id;
   id = get_global_id(0);
   idx = 0;
   idx_base = 0;
   offset = 0;
   out[id] = 0;
   int r_base = id/w_base;
   int c_base = id%w_base;
   __local int tmpint;
   //采用嵌套计算abs有问题。如果采用与pc一样的嵌套abs表达式,计算结果有差异。
   for(r=0; r<h;r++ )
   {
      idx_base = (r_base + r) * 1600 + c_base;
      for (c = 0; c < w; c++)
      {
         tmpint = pMask[idx]* (126-abs(pReal[idx]-pBase[idx_base]));      
         out[id] += abs(tmpint);
         idx++;
         idx_base++;
      }
   }
 }
其中,pMask是一个全为1的数组。
采用上面的写法,结果是与pc端一致的。
如果         tmpint = pMask[idx]* (126-abs(pReal[idx]-pBase[idx_base]));   
out[id] += abs(tmpint);
这两句写成
         out[id] += pMask[idx]* abs(126-abs(pReal[idx]-pBase[idx_base]));,结果就与PC端计算的结果不一致。请问这是什么原因导致的?多谢。
2
OpenCL / opencl中的命令队列CommandQueue
« 最后发表 作者 sean.jiao 十一月 10, 2023, 09:11:23 am »
在创建命令队列CommandQueue时,会出现CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE选项,表示乱序执行,乱序执行和顺序执行有什么区别?
命令队列栅栏clEnqueueBarrierWithWaitList的使用条件是什么,和clFinish有什么区别?
3
CUDA / bts run
« 最后发表 作者 Abigailvioms 十月 29, 2023, 12:59:23 am »
скачать песню тэхена
https://dzen.ru/a/ZQPbxp4rUVQI3r4N
4
CUDA / CUDA启动很多不参与计算的线程会怎样
« 最后发表 作者 2017012835 十月 25, 2023, 11:09:14 am »
请问我计算一个拥有1,000,000个元素的数组,在核函数中让每个线程计算一个数组,那么就得至少启动1,000,000个线程,但是在核函数中有一个if语句,实际上核函数中只计算了其中的10,000个元素,是怎么影响程序的效率的呢?
5
CUDA / Re: cuda-gdb 显示的错误信息
« 最后发表 作者 2017012835 十月 25, 2023, 11:06:04 am »
非常感谢,问题已解决!
6
OpenCL / Re: float 问题
« 最后发表 作者 xiaotuoluo9527 十月 18, 2023, 11:07:05 am »
你可以写入之前做一下 clamp 操作,将 half/float 数据截断在 (0.0f,1.0f)之内。
如果的数据不要求 (0.0f-1.0f)之内,保持原样就好。
7
阅读CUDA英文手册100天 / Test, just a test
« 最后发表 作者 XRumerTest 十月 05, 2023, 12:47:40 pm »
Hello. And Bye.
8
CUDA / 改造成kernel时,参数很多,怎么办?
« 最后发表 作者 master 八月 30, 2023, 09:57:26 pm »
想把原来在CPU下运行的子程序,改造成CUDA FORTRAN里的kernel。遇到一些问题,想请教大侠指点下。

原来的程序把变量定义在一个module里,其中还用save定义了一些全局变量。想要改造的这个子程序中用到了不少这些全局变量,有几十个。这个子程序开头use variables来使用这些全局变量,varialbes是存放这些变量的module。

这样的话,改造前这个子程序的参列表里就不需要把这些全局变量也列上,只列几个局部变量即可。

现在把子程序改造成kernel时就有点麻烦。这些全局变量是由CPU先计算好,然后调用kernel,这个kernel只是用了一下这些变量值,并不改变它们的值。

现在的改造思路是:把这些全局变量先传递到device上的相应数组,然后调用这个kernel,那么这个kernel的参数列表就将会很长(即需要把这些变量都写进去),因为kernel里不能定义全局变量。

这些全局变量在CPU里已经计算好,不再变化,调用kernel也不会导致它们变化。

kernel需要被反复调用数百次,每次调用时都有这些参数,感觉一是这个kernel后面括号的参数列表太长,也不好看。还有就是每次调用kernel都有这些参数,会不会影响效率。

不知道有没有遇到这种问题的,是如何解决的呢?遇到这种情况,该如何改造kernel?有没有办法使参数里面不写这些变量呢?
9
CUDA / Re: cuda-gdb 显示的错误信息
« 最后发表 作者 屠戮人神 七月 31, 2023, 10:42:17 pm »
你好,根据图片,你挂在了__ldg()函数的内部,八成是你使用了/计算了错误的地址/下标/索引之类的缘故。

你可以使用bt/info stack之类,进行回溯/查看调用堆栈(倒过来的)。
例如:
) info stack
#0 ... at sm_XX_intrinsic.hpp:134
#1 ... at your.cu:2333
#2 ... at your2.cu:6666
查询后面数字较大的frame所在的文件和行号即可,后面的一般的都是你自己的。这样即可快速定位。

此外,需要说明的是,现在visual studio code在linux上可以作为cuda-gdb的GUI外壳进行调试,直接从VS Code的图形化界面里查看/调试,无需记忆cuda-gdb命令(底层依然是cuda-gdb, 只是套上了图形化的界面了),十分方便,欢迎尝试。

你也可以临时性的将__ldg给重新define成普通的指针访存,这样可以直接cuda-gdb在top顶层frame显示你自己的代码的行号,而无需查看堆栈回溯信息,可能有的时候更方便一遍。调试完成了,再取消掉define即可。
10
CUDA / Re: cuda-gdb 显示的错误信息
« 最后发表 作者 屠戮人神 七月 31, 2023, 10:40:00 pm »
请问一下,用 cuda-gdb 调试程序输入了 r 命令,得到了图片上的报错内容,之前的报错都是定位到了程序中的某一行,但现在这个报错不知道说的是什么意思,请问出现这样的错误可能是哪里的问题呢?

你好,根据图片,你挂在了__ldg()函数的内部,八成是你使用了/计算了错误的地址/下标/索引之类的缘故。

你可以使用bt/info stack之类,进行回溯/查看调用堆栈(倒过来的)。
例如:
) info stack
#0 ... at sm_XX_intrinsic.hpp:134
#1 ... at your.cu:2333
#2 ... at your2.cu:6666
查询后面数字较大的frame所在的文件和行号即可,后面的一般的都是你自己的。这样即可快速定位。

此外,需要说明的是,现在visual studio code在linux上可以作为cuda-gdb的GUI外壳进行调试,直接从VS Code的图形化界面里查看/调试,无需记忆cuda-gdb命令(底层依然是cuda-gdb, 只是套上了图形化的界面了),十分方便,欢迎尝试。

页: [1] 2 3 ... 10