在主机上顺序使用 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
在该代码中,MatingProbability
和 CumulativeProbability
是 thrust::device_vector
。 thrust::transform
和 thrust::inclusive_scan
能够自动识别并在 GPU 上进行相应操作。
下面,我通过将 thrust::device_vector
更改为 thrust::host_vector
来提供相同的代码。同样,thrust::transform
和 thrust::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);
}
}
我想比较 Thrust 算法在单个 CPU 内核上顺序执行与在 GPU 上并行执行时的运行时间。
Thrust 指定 thrust::seq
execution policy,但我如何才能明确定位主机后端系统?我希望避免在 GPU 上顺序执行算法。
CUDA Thrust 与架构无关。因此,请考虑我提供的代码作为
的答案Cumulative summation in CUDA
在该代码中,MatingProbability
和 CumulativeProbability
是 thrust::device_vector
。 thrust::transform
和 thrust::inclusive_scan
能够自动识别并在 GPU 上进行相应操作。
下面,我通过将 thrust::device_vector
更改为 thrust::host_vector
来提供相同的代码。同样,thrust::transform
和 thrust::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);
}
}