推力:基于另一个向量选择性地复制

Posted

技术标签:

【中文标题】推力:基于另一个向量选择性地复制【英文标题】:Thrust: selectively copy based on another vector 【发布时间】:2021-11-03 15:27:58 【问题描述】:

我想使用一组推力操作,根据第三个向量 C 中元素的谓词,有选择地将一个向量 A 的元素复制到一个新向量 B 中。

这是一个示例:当B 中的对应元素为1 时,我想将元素(按顺序)从A 复制到C,如果它是0,则不要。如果B 中有0s,我想要|C| < |A|。我们可以通过减少B 来预先确定C 的大小。例如:

A = [2, 3, 6, 0, 11]

B = [1, 0, 1, 1, 0]

C = [2, 6, 0]

非常感谢任何帮助

【问题讨论】:

【参考方案1】:

这种算法称为流压缩。它在thrust::copy_if 中实现。

以下示例取自Thrust documentation。

#include <thrust/copy.h>
...
struct is_even

  __host__ __device__
  bool operator()(const int x)
  
    return (x % 2) == 0;
  
;
...
int N = 6;
int data[N]    =  0, 1,  2, 3, 4, 5;
int stencil[N] = -2, 0, -1, 0, 1, 2;
int result[4];
thrust::copy_if(data, data + N, stencil, result, is_even());
// data remains    =  0, 1,  2, 3, 4, 5;
// stencil remains = -2, 0, -1, 0, 1, 2;
// result is now      0, 1,  3, 5

【讨论】:

【参考方案2】:

尽管 Abator 已授予 function 使用权。让我尝试一个完整的例子。

//~~~START:Wed, 06-Oct-2021, 21:41:22 IST
//~~~Author:Rajesh Pandian M | mrprajesh.co.in
//~~CompiledWith: nvcc a.cu -std=c++14 --expt-extended-lambda

#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <thrust/copy.h>
#include <stdio.h>

int main(void) 
  const int N=5;
  int A[]=2, 3, 6, 0, 11; //Data
  int B[]=1, 0, 1, 1, 0 ; //Stencil
  thrust::device_vector<int> dA(A, A + N);
  thrust::device_vector<int> dB(B, B + N);

  // Allocates memory based on #number of 1's
  thrust::device_vector<int> dC(thrust::count(B, B+N,1));

  //Condition on the stencil elements. If 1 is seen copy, else do not!
  thrust::copy_if( dA.begin()
                  ,dA.end()
                  ,dB.begin()
                  ,dC.begin()
                  ,[] __host__ __device__ (const int& x)
                    return 1 == x;
                  );
  //Prints
  thrust::for_each(dC.begin(), dC.end(),
                  [] __host__ __device__(const int& x) printf("%d ",x););
  return 0;

【讨论】:

以上是关于推力:基于另一个向量选择性地复制的主要内容,如果未能解决你的问题,请参考以下文章

在我的机器上操作大向量时,CUDA 推力很慢

推力::主机向量和标准::向量有啥区别?

如何将向量传递给基于推力的 odeint 观察者的构造函数,以便可以在函子中读取它

Numpy 根据另一个数组的值分配一个数组值,其中列是基于向量选择的

推力包含扫描在调试构建中完成,但在发布构建中失败

推力::设备向量使用推力::替换或推力::转换与自定义函子/谓词