如何在推力压缩的情况下得到映射阵列



我需要知道当用推力压缩时,每个元素映射到什么位置。

例如:

arr:       5  2  -1  3  -1  6 -1  7
compacted: 5  2   3  6  7     --------------(remove all -1 element)
map Arr:   0  1  -1  2  -1  3 -1  4

映射数组,这里我指的是指示每个元素移动到哪个位置的数组,很抱歉,我无法想出更好的名称来描述这一点,我希望我把事情弄清楚了。

压缩推力很容易,但我想知道在压缩推力时是否可以得到映射数组。

以下推力调用序列可以生成所需的映射数组。

示例的输出是:

compacted: 5 2 3 6 7 
map: 0  0 -1  0 -1  0 -1  0 
map: 0  0 -1 -1 -2 -2 -3 -3 
map: 0  1  1  2  2  3  3  4 
map: 0  1 -1  2 -1  3 -1  4 

#include <iostream>
#include <string>
#include <thrust/scan.h>
#include <thrust/scatter.h>
#include <thrust/remove.h>
#include <thrust/iterator/counting_iterator.h>
#include <thrust/iterator/constant_iterator.h>
void print(const std::string& name, int* begin, int* end)
{
  std::cout << name << ": ";
  thrust::copy(begin, end, std::ostream_iterator<int>(std::cout, " "));
  std::cout <<std::endl;
}
struct is_marker
{
  __host__ __device__
  bool operator()(const int x) const
  {
    return (x == -1);
  }
};
int main()
{
  const int N = 8;
  int arr[N] = {5,2,-1,3,-1,6,-1,7};
  int compacted[N] = {0};
  int* compacted_end = thrust::remove_copy(arr, arr+N, compacted, -1);
  print("compacted", compacted, compacted_end);
  int map[N] = {0};
  thrust::scatter_if(thrust::make_constant_iterator(-1), thrust::make_constant_iterator(-1)+N, thrust::make_counting_iterator(0), arr, map, is_marker());
  print("map", map, map+N);
  thrust::inclusive_scan(map, map+N, map);
  print("map", map, map+N);
  thrust::transform(map, map+N, thrust::make_counting_iterator(0), map, thrust::plus<int>());
  print("map", map, map+N);
  thrust::scatter_if(thrust::make_constant_iterator(-1), thrust::make_constant_iterator(-1)+N, thrust::make_counting_iterator(0), arr, map, is_marker());
  print("map", map, map+N);
  return 0;
}

最新更新