我使用普通的CUDA代码编写了内核,它不使用推力设备向量。内核输出存储在设备上的数组中的一些结果,比如数组X.我现在想对X进行减少。有没有办法使用thrust :: reduction函数而不先将X复制到一个推力:: device_vector变量?
答案 0 :(得分:4)
传统的方法是将设备指针包装成thrust::device_ptr
并将其传递给推力算法。 Thrust中基于标签的模板模型将确保由于调用中提供的输入序列的类型而导致设备执行。
#include <thrust/device_ptr.h>
#include <thrust/reduce.h>
int* X;
cudaMalloc((void **)&X, sizeof(int) * size_t(N));
// Do stuff with X
thrust::device_ptr X_ptr(X);
int result = thrust::reduce(X_ptr, X_ptr+N);
从Thrust 1.7开始,引入了执行政策的概念。这消除了使用device_ptr
显式包装设备地址的需要。因此,您可以使用thrust::device
策略来指示输入迭代器在设备上并执行类似
#include <thrust/reduce.h>
#include <thrust/execution_policy.h>
int* X;
cudaMalloc((void **)&X, sizeof(int) * size_t(N));
// Do stuff with X
int result = thrust::reduce(thrust::device, X, X+N);
您选择执行此操作的方式应遵循您拥有的Thrust版本以及您喜欢的代码样式。