在主机上顺序使用 CUDA Thrust 算法

Using CUDA Thrust algorithms sequentially on the host

我想比较 Thrust 算法在单个 CPU 内核上顺序执行与在 GPU 上并行执行时的运行时间。

Thrust 指定 thrust::seq execution policy,但我如何才能明确定位主机后端系统?我希望避免在 GPU 上顺序执行算法。

CUDA Thrust 与架构无关。因此,请考虑我提供的代码作为

的答案

Cumulative summation in CUDA

在该代码中,MatingProbabilityCumulativeProbabilitythrust::device_vectorthrust::transformthrust::inclusive_scan 能够自动识别并在 GPU 上进行相应操作。

下面,我通过将 thrust::device_vector 更改为 thrust::host_vector 来提供相同的代码。同样,thrust::transformthrust::inclusive_scan 能够自动识别要操作的向量驻留在 CPU 上并相应地进行操作。

#include <thrust/host_vector.h>
#include <thrust/transform.h>
#include <thrust/functional.h>
#include <thrust/iterator/counting_iterator.h>
#include <thrust/iterator/constant_iterator.h>
#include <cstdio>

template <class T>
struct scaling {
    const T _a;
    scaling(T a) : _a(a) { }
    __host__ __device__ T operator()(const T &x) const { return _a * x; }
};

void main()
{
   const int N = 20;

   double a = -(double)N;
   double b = 0.;

   double Dx = -1./(0.5*N*(N+1));

   thrust::host_vector<double> MatingProbability(N);
   thrust::host_vector<double> CumulativeProbability(N+1, 0.);

   thrust::transform(thrust::make_counting_iterator(a), thrust::make_counting_iterator(b), MatingProbability.begin(), scaling<double>(Dx));

   thrust::inclusive_scan(MatingProbability.begin(), MatingProbability.end(), CumulativeProbability.begin() + 1);

   for(int i=0; i<N+1; i++) 
   {
      double val = CumulativeProbability[i];
      printf("%d %3.15f\n", i, val);
   }

}