Как скопировать row_indices из матрицы COO в вектор тяги в CUSP

Я пытался скопировать индексы строк, индексы столбцов и значения матрицы COO в отдельные векторы тяги, но обнаружил, что не могу этого сделать.

Ниже приведен код

    cusp::coo_matrix <unsigned int, float, cusp::device_memory> *sim_mat;
    sim_mat = new cusp::coo_matrix <unsigned int, float, cusp::device_memory>; 
    /* Code to fill up sim_mat: runs fine
    ...
    */
    {
         thrust::device_ptr <unsigned int> d_rows = &((sim_mat->row_indices));
         thrust::device_ptr <unsigned int> d_cols = &((sim_mat->column_indices)[0]);
         thrust::device_ptr <float>        d_vals = &((sim_mat->values)[0]);
         unsigned int size_nn = (sim_mat->row_indices).size();
         thrust::device_vector <unsigned int> d_Rows;
         thrust::device_vector <float>        d_Vals;
         thrust::device_vector <unsigned int> reduced_Rows;

         // Code fails below this point
         thrust::copy_n (d_rows, size_nn, d_Rows.begin());
         thrust::copy_n (d_vals, size_nn, d_Vals.begin());
         cout << size_nn << std::endl;

         if (!(sim_mat->is_sorted_by_row()))
             thrust::sort_by_key(d_Rows.begin(), d_Rows.end(), d_Vals.begin());
         thrust::reduce_by_key(d_Rows.begin(), d_Rows.end(), d_Vals.begin(), reduced_Rows.begin(), sim_row->begin());

    }

Ithe sim_row — это указатель вектора тяги, который был выделен в памяти в каком-то предыдущем коде и здесь не актуален.

Код компилируется, но во время выполнения происходит сбой с ошибкой:

завершение вызывается после создания экземпляра 'thrust::system::system_error' what(): недопустимый аргумент Прервано (сброшено ядро)

Может ли кто-нибудь сказать мне, что я делаю неправильно?

Спасибо, Акшай.


person akshayc11    schedule 26.02.2013    source источник
comment
Ваш метод назначения d_rows, d_cols и d_vals очень неверен.   -  person talonmies    schedule 27.02.2013


Ответы (1)


В вашей кодировке есть несколько ошибок. Как уже указывалось, ваш метод доступа к индексам строк, индексам столбцов и значениям матрицы coo не будет работать. Кроме того, вы не можете создавать векторы тяги типа d_Rows, d_Vals нулевого размера, а затем копировать в них другие векторы.

следующий код работает для меня и иллюстрирует один из способов извлечения индексов строк, индексов столбцов и значений в отдельные векторы тяги:

 #include <stdio.h>
 #include <cusp/verify.h>
 #include <cusp/array2d.h>
 #include <cusp/coo_matrix.h>
 #include <thrust/host_vector.h>
 #include <thrust/device_vector.h>

 int main()
 {
  typedef cusp::device_memory MemorySpace;
  // initial matrix

   cusp::array2d<float, MemorySpace> E(4, 3);
   E(0,0) =  1.000e+00; E(0,1) =  0.000e+00; E(0,2) =  0.000e+00;
   E(1,0) =  0.000e+00; E(1,1) =  1.050e+01; E(1,2) =  0.000e+00;
   E(2,0) =  0.000e+00; E(2,1) =  0.000e+00; E(2,2) =  2.500e-01;
   E(3,0) =  0.000e+00; E(3,1) =  2.505e+02; E(3,2) =  0.000e+00;

   cusp::coo_matrix<int, float, MemorySpace> coo(E);

   if (!cusp::is_valid_matrix(coo)) {printf("Invalid COO\n"); return 1;}

   thrust::device_vector<int> row_ind(coo.row_indices.size());
   thrust::device_vector<int> col_ind(coo.column_indices.size());
   thrust::device_vector<float> values(coo.values.size());

   thrust::copy(coo.row_indices.begin(), coo.row_indices.end(), row_ind.begin());
   thrust::copy(coo.column_indices.begin(), coo.column_indices.end(), col_ind.begin());
   thrust::copy(coo.values.begin(), coo.values.end(), values.begin());

   thrust::host_vector<int> h_row_ind = row_ind;
   thrust::host_vector<int> h_col_ind = col_ind;
   thrust::host_vector<float> h_values = values;

   printf("COO row indices: \n");
   for (int i = 0; i < h_row_ind.size(); i++)
     printf("%d \n", h_row_ind[i]);


   printf("COO column indices: \n");
   for (int i = 0; i < h_col_ind.size(); i++)
     printf("%d \n", h_col_ind[i]);


   printf("COO values: \n");
   for (int i = 0; i < h_values.size(); i++)
     printf("%f \n", h_values[i]);

   return 0;
 }
person Robert Crovella    schedule 27.02.2013