2017-03-09 15 views
1

나는 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)에 설명 된 스트림 압축 알고리즘을 약간 수정하여 얻을 수 있습니다. – 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];