Индекс вычисления тяги CUDA для каждого сегмента в массиве - PullRequest
0 голосов
/ 04 октября 2019

У меня есть массив int, который служит ключом в моем приложении. Это уже отсортировано. Я хочу назначить каждому уникальному ключу уникальный индекс, начиная с 0. Как бы я сделал это в cuda, используя thrust?

    int* sorted_keys = {1, 1, 1, 13, 13, 13, 13, 13, 19, 19, 20}
    // Some thrust operation to get a new array as
    index_for_sorted_keys = {0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 3}

Каждый сегмент может иметь любую произвольную длину.

1 Ответ

1 голос
/ 19 октября 2019

Вероятно, есть много способов сделать это. Один из возможных способов: thrust::adjacent_difference() с двоичной операцией, которая выдает 0, если значения одинаковы, и 1 в любом другом случае, за которым следует сумма префикса .

* 1007. * Вот рабочий пример:
$ cat t1537.cu
#include <thrust/adjacent_difference.h>
#include <thrust/scan.h>
#include <thrust/device_vector.h>
#include <iostream>
#include <thrust/copy.h>

using namespace thrust::placeholders;
int main(){

    int sorted_keys[] = {1, 1, 1, 13, 13, 13, 13, 13, 19, 19, 20};
    int ds = sizeof(sorted_keys)/sizeof(sorted_keys[0]);
    thrust::device_vector<int> d_sk(sorted_keys, sorted_keys+ds);
    thrust::device_vector<int> d_r(d_sk.size());
    thrust::adjacent_difference(d_sk.begin(), d_sk.end(), d_r.begin(), !(_1==_2));
    d_r[0] = 0;
    thrust::inclusive_scan(d_r.begin(), d_r.end(), d_r.begin());
    thrust::copy(d_r.begin(), d_r.end(), std::ostream_iterator<int>(std::cout, ","));
    std::cout << std::endl;
    return 0;
}
$ nvcc -o t1537 t1537.cu
$ ./t1537
0,0,0,1,1,1,1,1,2,2,3,
$
...