bool SharedMemoryManagerVoxelLists::getVisualizationData(Cube*& cubes, uint32_t& size, const uint32_t index)
{
  std::string handler_name = shm_variable_name_voxellist_handler_dev_pointer + boost::lexical_cast<std::string>(index);
  std::string number_cubes_name = shm_variable_name_voxellist_num_voxels + boost::lexical_cast<std::string>(index);

  // Find shared memory handles for: Cubes device pointer, number of cubes
  std::pair<cudaIpcMemHandle_t*, std::size_t> shm_cubes_handle = shmm->getMemSegment().find<cudaIpcMemHandle_t>(handler_name.c_str());
  std::pair<uint32_t*, std::size_t> shm_size = shmm->getMemSegment().find<uint32_t>(number_cubes_name.c_str());

  if (shm_cubes_handle.second == 0 || shm_size.second == 0)
  {
    // Shared memory handles not found
    return false;
  }

  size_t new_size = *shm_size.first;
  if (new_size > 0)
  {
    Cube* new_cubes;
    cudaError_t cuda_error = cudaIpcOpenMemHandle((void**) &new_cubes, *shm_cubes_handle.first, cudaIpcMemLazyEnablePeerAccess);
    if (cuda_error == cudaSuccess)
    {
      cubes = new_cubes;
      size = new_size;
    }
    else
    {
      // IPC handle to device pointer could not be opened
      cudaIpcCloseMemHandle(new_cubes);
      return false;
    }
  }
  else
  {
    cubes = NULL; // No memory is allocated when voxellist is empty
    size = new_size;
  }

  return true;
}
bool SharedMemoryManagerOctrees::getOctreeVisualizationData(Cube*& cubes, uint32_t& size, uint32_t index)
{
  bool error = false;

  std::string handler_name = shm_variable_name_octree_handler_dev_pointer + boost::lexical_cast<std::string>(index);
  std::string number_cubes_name = shm_variable_name_number_cubes + boost::lexical_cast<std::string>(index);

  //Find the handler object
  std::pair<cudaIpcMemHandle_t*, std::size_t> res_h = shmm->getMemSegment().find<cudaIpcMemHandle_t>(
      handler_name.c_str());
  error = res_h.second == 0;
  Cube* dev_data_pointer;

  if (!error)
  {
    cudaIpcMemHandle_t handler = *res_h.first;
    // get to device data pointer from the handler
    cudaError_t cuda_error = cudaIpcOpenMemHandle((void**) &dev_data_pointer, (cudaIpcMemHandle_t) handler,
                                                  cudaIpcMemLazyEnablePeerAccess);
    // the handle is closed by Visualizer.cu
    if (cuda_error == cudaSuccess)
    {
      //Find the number of cubes
      std::pair<uint32_t*, std::size_t> res_d = shmm->getMemSegment().find<uint32_t>(number_cubes_name.c_str());
      error = res_d.second == 0;
      if (!error)
      {
        cubes = dev_data_pointer;
        size = *res_d.first;
        return true;
      }
    }
  }
  /*If an error occurred */
  cudaIpcCloseMemHandle(dev_data_pointer);
  return false;
}
Beispiel #3
0
static cudaError_t THCIpcAllocator_free(void* ctx, void* devPtr)
{
  return cudaIpcCloseMemHandle(devPtr);
}