使用包含每个重复数量的列表生成重复,上升整数的顺序,并用推力

Generate sequence of repeating, ascending integers, using a list containing the number of repetitions for each, with thrust

本文关键字:整数 顺序 列表 包含每      更新时间:2023-10-16

我想生成一系列重复上升整数,给定一个列表,其中包含每个重复的数量:

thrust::device_vector<int> reps {3, 2, 5, 1};
//This vector should yield a resulting list:
// {0,0,0, 1,1, 2,2,2,2,2, 3}

理想情况下,我想使用推力API进行此操作。

我考虑了这种方法:

  1. 前缀总和代表列表以产生累积代表列表。
  2. 使用累积代表列表中的最终元素分配生成的整数向量。
  3. 使用内核,为代表列表的每个元素运行线程,然后从i = 0 : reps[tid]循环,将tid存储在cumulative_reps[tid]+i中。

这将有效,但最终可能会在串行中完成大部分工作,并击败使用CUDA的观点。

我想知道是否有推力迭代器和算法的组合可以简洁地产生整数列表?另外,即使没有推力,也比我概述的方法更好。

您可以使用类似于您的方法纯粹用推力进行操作。

  1. 在输入上进行前缀总和,以确定步骤2的结果大小,并为步骤3的散点图
  2. 创建一个输出向量以保持结果
  3. 由步骤1
  4. 给出的索引,将输出向量的适当位置散射到适当的位置。
  5. 在输出向量上执行前缀总和。

请注意,如果允许输入reps向量包含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,
$