c++ 如何在推力中找到一个向量的索引

t98cgbkg  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(109)

我有两个推力装置矢量,假设是,a,和,B,我想找到向量 a 的索引,其中它小于/大于向量 B 的成对分量($a_{ij}>B_{ij}$)。
我找到了以下关于如何使用标量的链接:

我的主要问题是transform只需要一个向量作为输入,而对于另一种方法,我不确定如何进行成对比较。
例如:a = {1,3,5,6,9}和 B = {2,1,4,7,8}。我正在寻找指数,其中 a_ij >B_ij。
因此,输出应该是{1,2,4},索引为0,因为 a 在这些位置比 b 的成对分量大。

ckocjqey

ckocjqey1#

这至少部分地是流压缩问题。Thrust提供流压缩算法,如copy_if
Thrust确实有一个transform变体,它接受两个向量作为输入。你也可以用zip_iterator做类似的事情,作为任何推力算法的输入。
我认为最紧凑的方法是同时使用copy_if和zip迭代器和计数迭代器。有一个copy_if变体可以接受一个模板数组,它可以很好地满足我们这里的目的。
下面是一个示例:

# cat t61.cu
#include <thrust/copy.h>
#include <thrust/iterator/zip_iterator.h>
#include <thrust/iterator/counting_iterator.h>
#include <thrust/device_vector.h>
#include <thrust/host_vector.h>

using mt = int;  // data type
using it = size_t; // index type

struct my_functor
{
  template <typename T>
  __host__ __device__
  bool operator()(T t) { return (thrust::get<0>(t) > thrust::get<1>(t));}
};

int main(){

  mt a[] = {1,3,5,6,9};
  mt b[] = {2,1,4,7,8};
  it len = sizeof(a)/sizeof(a[0]);
  thrust::device_vector<mt> da(a, a+len);
  thrust::device_vector<mt> db(b, b+len);
  thrust::device_vector<it> dr(len);
  auto my_idx = thrust::counting_iterator<it>(0);
  auto my_zip = thrust::make_zip_iterator(thrust::make_tuple(da.begin(), db.begin()));
  it lr = thrust::copy_if(my_idx, my_idx+len, my_zip, dr.begin(), my_functor()) - dr.begin();
  thrust::host_vector<it> hr = dr;
  thrust::copy_n(hr.begin(), lr, std::ostream_iterator<it>(std::cout, ","));
  std::cout << std::endl;
}
# nvcc -o t61 t61.cu
# compute-sanitizer ./t61
========= COMPUTE-SANITIZER
1,2,4,
========= ERROR SUMMARY: 0 errors

相关问题