在CUDA中进行条件复制,其中数据向量比模板长

时间:2019-05-22 19:05:02

标签: cuda thrust

我想根据模板向量有条件地从向量中复制数据,该模板向量要短N倍。模具中的每个元素将负责数据向量中的N个元素。 假设向量看起来如下(N = 3)

data = {1,2,3,4,5,6,7,8,9}
stencil = {1,0,1}

我想得到的结果:

result = {1,2,3,7,8,9}

是否有一种方法可以使用Thrust库中的函数来实现?

我知道,有:

thrust::copy_if (InputIterator1 first, InputIterator1 last, InputIterator2 stencil, OutputIterator result, Predicate pred)

但是,这不允许我基于模具中的一个元素从数据向量中复制N个值。

1 个答案:

答案 0 :(得分:1)

通常,我想有很多方法可以做到这一点。

我想到的方法(使用copy_if是将stencil向量用作thrust::permutation_iterator的一部分,该向量采用stencil向量并生成索引使用thrust::transform_iterator进入它。如果我们在本例中想象到一个从0..8开始的复制索引,那么我们可以使用“ map”索引来索引“源”(即模板)向量,该索引使用thrust::counting_iterator计算得出,整数除以{ {1}}(使用推力占位符)。复制谓词仅测试模板值是否== 1。

推力quick start guide简要说明了如何使用这些奇特的迭代器。

这是一个可行的示例:

N

使用此处关于$ cat t471.cu #include <thrust/copy.h> #include <thrust/device_vector.h> #include <thrust/iterator/permutation_iterator.h> #include <thrust/iterator/transform_iterator.h> #include <thrust/iterator/counting_iterator.h> #include <iostream> using namespace thrust::placeholders; int main(){ int data[] = {1,2,3,4,5,6,7,8,9}; int stencil[] = {1,0,1}; int ds = sizeof(data)/sizeof(data[0]); int ss = sizeof(stencil)/sizeof(stencil[0]); int N = ds/ss; // assume this whole number divisible thrust::device_vector<int> d_data(data, data+ds); thrust::device_vector<int> d_stencil(stencil, stencil+ss); thrust::device_vector<int> d_result(ds); int rs = thrust::copy_if(d_data.begin(), d_data.end(), thrust::make_permutation_iterator(d_stencil.begin(), thrust::make_transform_iterator(thrust::counting_iterator<int>(0), _1 / N)), d_result.begin(), _1 == 1) - d_result.begin(); thrust::copy_n(d_result.begin(), rs, std::ostream_iterator<int>(std::cout, ",")); std::cout << std::endl; return 0; } $ nvcc -o t471 t471.cu $ ./t471 1,2,3,7,8,9, $ 的组织假设,我们还可以用stencil预先计算结果大小rs,并使用它来分配结果向量大小:

thrust::reduce