求教,设备端数据作为参数传入到核函数中,数值发生了改变,基本接近0,导致计算结果发生错误

  • 4 replies
  • 394 views
如题,求教如下:
 
    float* d_x;
    float* d_y;
    float* d_px;
    float* d_py;
    float* d_input;
    float* d_output;

    Kernel << <BlocksPerGrid, ThreadsPerBlock>> > (d_x, d_y,d_px, d_py,d_input, d_output);

该核函数中的前四个数据传递到核函数中,其数值都发生了改变,而第五个参数d_input很正确的传递了进去,请问这是什么原因,有朋友遇到过吗?


如题,求教如下:
 
    float* d_x;
    float* d_y;
    float* d_px;
    float* d_py;
    float* d_input;
    float* d_output;

    Kernel << <BlocksPerGrid, ThreadsPerBlock>> > (d_x, d_y,d_px, d_py,d_input, d_output);

该核函数中的前四个数据传递到核函数中,其数值都发生了改变,而第五个参数d_input很正确的传递了进去,请问这是什么原因,有朋友遇到过吗?

楼主你好, 根据你的代码, 你的这5个参数, 均是指针. 只有对指针的进一步提领(de-reference), 才能得到具体的float数值. 所以你的描述, 前4个参数本身"接近于0.0", 这种描述是无意义的.

可能的原因是, 你对这些指针的使用有误(例如错误的偏移量或者地址值变换), 从而访问到错误的数据.

请重新检查情况, 如果有必要, 重新描述问题.

感谢回复,经过检查,发现之前统一申请内存,待所有计算完成后统一释放,改为计算完毕后,立即释放变量,这样莫名其妙就OK了,因为是新手,还是不明就里

感谢回复,经过检查,发现之前统一申请内存,待所有计算完成后统一释放,改为计算完毕后,立即释放变量,这样莫名其妙就OK了,因为是新手,还是不明就里

这个和每次计算完成立刻释放内存, 和所有计算完成后统一释放无关.

需要指出的是, 频繁的每次立刻申请释放是典型的不良行为(因为cudaMalloc*()/Free()的代价高昂).

你的问题可能依然在其他地方, 只是你这样做被掩盖了.

好的,谢谢,我在斟酌斟酌,