集成了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

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

被折叠的 条评论
为什么被折叠?



