CUDA-PointPillars有时崩溃的原因

博客讲述了在使用CUDA-PointPillars时遇到的程序崩溃问题,问题出现在预处理kernel中,由于浮点数转换为整数时的舍入误差导致数组访问越界。作者发现了两个缺陷,一是浮点到整数转换可能导致voxel_idx或voxel_idy越界,二是未检查voxels数量是否超过最大限制。经过修复,崩溃问题得到解决,并已向官方报告问题等待正式修复。

集成了CUDA-PointPillars的程序有时突然崩溃,而且崩溃的位置怪异,发生在CUDA的cudaDeviceSynchronize()或cudaStreamsynchronize()或cudaEventSynchronize、cudaEventRecord()之类的API里,反正是平时不大可能发生的地方,凭以往经验直觉,原因应该不是在这些API里,而是因该其他地方有非法访问把内存搞乱了,调查后发现果然是CUDA-PointPillars里的预处理部分代码有漏洞:

__global__ void generateVoxels_random_kernel(float *points, size_t points_size,
        float min_x_range, float max_x_range,
        float min_y_range, float max_y_range,
        float min_z_range, float max_z_range,
        float pillar_x_size, float pillar_y_size, float pillar_z_size,
        int grid_y_size, int grid_x_size,
        unsigned int *mask, float *voxels)
{
  int point_idx = blockIdx.x * blockDim.x + threadIdx.x;
  if(point_idx >= points_size) return;

  float4 point = ((float4*)points)[point_idx];

  if(point.x<min_x_range||point.x>=max_x_range
    || point.y<min_y_range||point.y>=m
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arnold-FY-Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值