Как преобразовать плотный вектор в разреженный вектор в CUDA?

У меня большой плотный вектор (не матрица) в памяти GPU:

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

и хочу преобразовать его в разреженный формат:

значения = [1,3,4]; индекс = [0,1,4]

Я знаю, что могу позвонить cusparse<t>dense2csc() в cuSPARSE, но он предназначен для матрицы и может быть неэффективным для вектора. Есть ли другой способ сделать это? Или, может быть, ядро ​​CUDA. Спасибо

1 ответ

Решение

Использование 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];
Другие вопросы по тегам