2017-03-09 9 views
1

Iは、GPUメモリの大密ベクトル(行列ではない)を有する:CUDAで密ベクトルを疎ベクトルに変換するには?

[1,3,0,0,4,0,0]

および疎に変換しますフォーマット:

値= [1,3,4];インデックス= [0,1,4]

私はcuSPARSEcusparse<t>dense2csc()を呼び出すことができます知っているが、それは、マトリックスのために設計されています、そして、ベクターのための効率的ではないかもしれません。これを行う他の方法はありますか?あるいはCUDAカーネルかもしれません。おかげ

+0

ベクトルはただ1列(または1行)の行列として見ることができるので、あなたは1に設定し、「列数」と 'dense2csc'呼び出すことができませんでしたか? –

+1

この変換は、[GPU Gems 3](http://http.developer.nvidia.com/GPUGems3/gpugems3_ch39.html)で説明されているStream Compactionアルゴリズムのわずかな変更で実現できます。 – sgarizvi

+1

変更は、ベクトル値を書き込むだけでなく、最終段階でインデックスと同様にインデックスを書き込むことができるということです。 – sgarizvi

答えて

2

使用thrust::copy_if

int * d_index = [1,3,0,0,4,0,0]; 
int * d_index_compact; 

struct non_negative 
{ 
    __host__ __device__ 
    bool operator()(const int x) 
    { 
     return x >= 0; 
    } 
}; 


thrust::copy_if(thrust::cuda::par, d_index, d_index + this->vocab_size , d_index_compact, non_negative()); // d_index_compact = [1,3,4]; 
関連する問題