Search code examples
cudathrust

Using CUDA Thrust algorithms sequentially on the host


I wish to compare a Thrust algorithm's runtime when executed sequentially on a single CPU core versus a parallel execution on a GPU.

Thrust specifies the thrust::seq execution policy, but how can I explicity target the host backend system? I wish to avoid executing the algorithm sequentially on the GPU.


Solution

  • CUDA Thrust is architecture agnostic. Accordingly, consider the code I provided as an answer to

    Cumulative summation in CUDA

    In that code, MatingProbability and CumulativeProbability were thrust::device_vectors. thrust::transform and thrust::inclusive_scan were automatically able to recognize that and operate accordingly on the GPU.

    Below, I'm providing the same code by changing thrust::device_vector to thrust::host_vector. Again, thrust::transform and thrust::inclusive_scan are able to automatically recognize that the vectors to operate on reside on the CPU and to operate accordingly.

    #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);
       }
    
    }