pcl icon indicating copy to clipboard operation
pcl copied to clipboard

Crash on returning filtered pointcloud (Statisical or Radius) - AVX/SSE issue

Open geoeo opened this issue 3 months ago • 7 comments

Describe the bug

memory free error when using statistical outlier filter or radius outlier filter. Pass through works. This happens when either SSE or AVX are enabled

A clear and concise description of what the bug is.

When using the filters mentioned above to filter a point cloud the program crashes when the function returns on a memory free

What are you trying to accomplish? Providing context helps us come up with a solution that is most useful in the real world

Filter point clouds

A clear and concise description of what you expected to happen.

The program does not crash

What happens instead of the expected behavior?

The program crashes

Screenshots/Code snippets

Setup:

WORKDIR /root
RUN apt update && apt install -y libeigen3-dev liblz4-dev libhdf5-dev libgl1-mesa-dev libboost-all-dev

RUN wget https://github.com/flann-lib/flann/archive/refs/tags/1.9.2.zip
RUN unzip 1.9.2.zip
RUN cd flann-1.9.2 && mkdir -p build && cd build \
&& cmake -DBUILD_CUDA_LIB=ON -DCMAKE_BUILD_TYPE=Release .. \
&& make -j $(nproc --all) && make install
RUN rm 1.9.2.zip

WORKDIR /root
RUN wget https://github.com/PointCloudLibrary/pcl/archive/refs/tags/pcl-1.14.1.zip
RUN unzip pcl-1.14.1.zip
RUN cd pcl-pcl-1.14.1 && mkdir -p build && cd build \
&& cmake -DBUILD_GPU=ON \
    -DWITH_PCAP=OFF \
    -DWITH_LIBUSB=OFF \
    -DWITH_VTK=OFF \
    #-DPCL_ENABLE_SSE=OFF \
    -DPCL_ENABLE_AVX=OFF \
    -DPCL_NO_PRECOMPILE=ON \
    -DCMAKE_CXX_STANDARD=17 \
    -DCMAKE_CUDA_STANDARD=17 \
    -DCMAKE_BUILD_TYPE=Release .. \
&& make -j $(nproc --all) && make install
RUN rm pcl-1.14.1.zip

Code:


pcl::PointCloud<pcl::PointXYZ>::Ptr DigitalSurfaceModel::filterPointCloud(const cv::Mat &points, float min_z, float max_z)
{
  assert(points.type() == CV_64F);
  assert(m_assumption == SurfaceAssumption::ELEVATION);

  LOG_F(INFO, "PCL size before filtering: %d", points.rows);
  pcl::PointCloud<pcl::PointXYZ>::Ptr point_cloud(new pcl::PointCloud<pcl::PointXYZ>);
  point_cloud->points.resize(points.rows);
  vector<int> indices(points.rows); 
  iota(indices.begin(), indices.end(), 0); 

  transform(execution::par_unseq,indices.begin(),indices.end(),point_cloud->points.begin(),[&points](const auto i)
  {
    return pcl::PointXYZ(
      static_cast<float>(points.at<double>(i,0)),
      static_cast<float>(points.at<double>(i,1)),
      static_cast<float>(points.at<double>(i,2))
    );
  });

  point_cloud->width = (int)point_cloud->points.size();
  point_cloud->height = 1;

  pcl::PointCloud<pcl::PointXYZ>::Ptr point_cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
  
  // pcl::PassThrough<pcl::PointXYZ> pass;
  // pass.setInputCloud (point_cloud);
  // pass.setFilterFieldName ("z");
  // pass.setFilterLimits (min_z, max_z);
  // pass.setNegative (false);
  // pass.setKeepOrganized(false);
  // pass.filter (*point_cloud_filtered);

  // Seems to be a memory issue when returning a pointcloud filtered by sor?
  pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
  sor.setInputCloud (point_cloud);
  sor.setMeanK (20);
  sor.setStddevMulThresh (2.0);
  sor.setKeepOrganized(false);
  sor.filter (*point_cloud_filtered);

  // pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;
  // outrem.setInputCloud(point_cloud);
  // outrem.setRadiusSearch(0.8);
  // outrem.setMinNeighborsInRadius (2);
  // outrem.setKeepOrganized(false);
  // outrem.filter (*point_cloud_filtered);

  LOG_F(INFO, "PCL size after filtering: %ld", point_cloud_filtered->points.size());
  return point_cloud_filtered; //<----- Crash on return
}

Your Environment (please complete the following information):

  • OS: Ubuntu 22.04
  • Compiler: GCC 11.4
  • PCL Version1.14.1 / (Also happens on 1.14.0)
  • Eigen 3.4.0

geoeo avatar May 13 '24 09:05 geoeo

Edit: It seems the culprit were AVX/SSE instructions. After I disabled them both on compilation it works!

geoeo avatar May 13 '24 09:05 geoeo

Hi, the thing with SSE and AVX is that the options used when compiling PCL should match the options used for your own project, otherwise problems can occur. Usually, CMake takes care of this (unless you do not use CMake for building your own project, edit: or you manually change SSE/AVX options in your own CMakeLists.txt). Enabling PCL_NO_PRECOMPILE also often makes these problems go away because more of PCL's code is compiled together with your own code, so SSE/AVX options are the same. If you provide a backtrace, e.g. from gdb or valgrind, I can try to take a guess what exactly happens in your case.

mvieth avatar May 13 '24 12:05 mvieth

@mvieth Will do. In another note: Could the problem we that I didnt compile eigen with AVX/SSE? I just installed via apt

geoeo avatar May 13 '24 12:05 geoeo

@mvieth Will do. In another note: Could the problem we that I didnt compile eigen with AVX/SSE? I just installed via apt

Eigen is a header-only library, so there are no binaries installed. The classes and functions from Eigen are compiled when PCL and your own project are compiled.

mvieth avatar May 13 '24 13:05 mvieth

Ok so I recompiled PCL in Debug mode with AVX and SSE on. And I am running my code in RelWithDebug. It doesnt seem to happen in Debug.

image

image

I think whats happening is that it tries to free the point_cloud data structure and somehow the filtering already consumes it? Sorry that I cant provide a more detailed trace

geoeo avatar May 13 '24 13:05 geoeo

I think whats happening is that it tries to free the point_cloud data structure and somehow the filtering already consumes it? Sorry that I cant provide a more detailed trace

point_cloud_filtered is filled by the outlier removal filter, and point_cloud is only read from by the filter, so I don't think that's it. Another thing: can you post your CMakeLists.txt? And run your program with valgrind? That might give us more information.

mvieth avatar May 14 '24 08:05 mvieth

point_cloud is a scoped pcl that should be released when the functions returns.

geoeo avatar May 14 '24 10:05 geoeo