Вы можете сделать это чисто с помощью тяги, используя подход, аналогичный вашему.
- Введите префиксную сумму на входе, чтобы определить размер результата для шага 2, и индексы разброса для шага 3
- Создать выходной вектор для хранения результата
- разбросать по соответствующим местам в выходном векторе, заданном индексами из шага 1
- сделать сумму префикса на выходеvector.
Обратите внимание, что этот метод должен быть изменен, если входному вектору повторений разрешено содержать значения 0.
Вот рабочий пример:
$ cat t404.cu
#include <thrust/scan.h>
#include <thrust/device_vector.h>
#include <thrust/copy.h>
#include <thrust/iterator/constant_iterator.h>
#include <thrust/iterator/permutation_iterator.h>
#include <iostream>
int main(){
int host_reps[] = {3, 2, 5, 1};
int ds = sizeof(host_reps)/sizeof(int);
thrust::device_vector<int> reps(host_reps, host_reps+ds);
thrust::inclusive_scan(reps.begin(), reps.end(), reps.begin());
thrust::device_vector<int> result(reps[reps.size()-1]);
thrust::copy_n(thrust::constant_iterator<int>(1), reps.size()-1, thrust::make_permutation_iterator(result.begin(), reps.begin()));
thrust::inclusive_scan(result.begin(), result.end(), result.begin());
thrust::copy_n(result.begin(), result.size(), std::ostream_iterator<int>(std::cout, ","));
std::cout << std::endl;
}
$ nvcc -o t404 t404.cu
$ ./t404
0,0,0,1,1,2,2,2,2,2,3,
$