0

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());

    }

sim_rowは、以前のコードでメモリが割り当てられた推力ベクトルポインタであり、ここでは関係ありません。

コードはコンパイルされますが、実行時に次のエラーで失敗します。

'thrust :: system :: system_error'のインスタンスをスローした後に呼び出された終了what():無効な引数中止(コアダンプ)

誰かが私が間違っていることを教えてもらえますか?

ありがとうAkshay

4

1 に答える 1

2

あなたのコーディングにはいくつかのエラーがあります。既に指摘したように、coo 行列の行インデックス、列インデックス、および値にアクセスする方法は機能しません。d_Rowsさらに、d_Valsサイズがゼロの のような推力ベクトルを作成してから、他のベクトルをそれらにコピー することはできません。

次のコードは私にとってはうまくいき、行インデックス、列インデックス、および値を個別の推力ベクトルに抽出する 1 つの方法を示しています。

 #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;
 }
于 2013-02-27T03:08:31.860 に答える