thust :: device_vector структуры throw Ошибка шины - PullRequest
1 голос
/ 06 мая 2020

При попытке создать thrust::device_vector из struct я получаю Bus error (core dumped). Странно то, что приведенный ниже код отлично работает на моем ноутбуке (Quadro P2000). Однако, когда я переношу этот код на Jetson TX2 (протестирован в двух разных), ошибка появляется. Я прилагаю простой код, который может воспроизвести эту проблему

gpu_variable.h

#pragma once
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>

class GpuFloat3Ptr {
 public:
  GpuFloat3Ptr() = delete;
  __host__ explicit GpuFloat3Ptr(float* cpu_float, size_t size);
  __host__ ~GpuFloat3Ptr();
  void useThrust(int num_points);

 protected:
  float3* var_;
  size_t size_;
};

gpu_variable.cu

#include "gpu_variable.h"
#include <stdio.h>
#include <cassert>
#include <thrust/device_vector.h>

struct cloud_point_index_idx {
  unsigned int idx;
  float3 cloud_point;
  int instance;

  cloud_point_index_idx() = default;

  __host__ __device__
  cloud_point_index_idx(unsigned int idx_, float3 cloud_point_, int instance_) :
    idx(idx_), cloud_point(cloud_point_), instance(instance_) {}
};

GpuFloat3Ptr::GpuFloat3Ptr(float* cpu_float, size_t size) : size_(size) {
  cudaError_t cuda_stat = cudaMallocManaged(&var_, size);
  assert(cuda_stat == cudaSuccess);
  for (int i = 0; i < size / sizeof(float3); i++) {
    var_[i].x = cpu_float[3 * i];
    var_[i].y = cpu_float[3 * i + 1];
    var_[i].z = cpu_float[3 * i + 2];
  }
}

GpuFloat3Ptr::~GpuFloat3Ptr() {
  if (var_) cudaFree(var_);
}

void GpuFloat3Ptr::useThrust(int num_points) {
  thrust::device_vector<cloud_point_index_idx> voxel_idx_vector(num_points);
}

main.cc

#include "gpu_variable.h"
#include <random>
#include <iostream>

int main() {
  int number_points[] = {20, 30, 40, 50, 60, 70, 80, 90, 100, 110};
  for (int i = 0; i < 10; i++) {
    int cloud_size = number_points[i];
    std::cout << "Test " << cloud_size << " points in point cloud\n";
    float* myarray = new float[3*cloud_size];
    unsigned int seed(time(0));
    // Populate array
    for (int i = 0; i < 3 * cloud_size; i++) {
      myarray[i] = (rand_r(&seed) % 10 * 100) / 100.0;
    }
    GpuFloat3Ptr ptr(myarray, 3*cloud_size*sizeof(float));
    ptr.useThrust(cloud_size);
    delete[] myarray;
  }
}
$ nvcc -o test gpu_variable.cu main.cc 
$ ./test 
Test 20 points in point cloud
Test 30 points in point cloud
Bus error (core dumped)

Ошибка возникает, когда я вызываю функцию useThrust.

1 Ответ

1 голос
/ 07 мая 2020

Отвечу на свой вопрос здесь. Благодаря совету @talonmies проблема возникла из-за использования управляемой памяти. TX2 имеет другую модель управляемой памяти, из-за которой мой код не работает. Использование cudaMalloc вместо cudaMallocManaged исправлено.

...