Ответ Кевемана верен, я просто хочу добавить полезный совет, который требует кода, поэтому я выложу его здесь, а не в комментариях.
Thrust 1.5 добавляет лямбда-заполнители, которые могут сделать подход @ keveman еще проще. Вместо функтора просто определите operator+
для int2
, а затем замените создание экземпляра функтора на выражение-заполнитель _1 + _2
lambda. Вы также можете заменить явное объявление init
вызовом make_int2()
(предоставленным CUDA). Примечание: int2 operator+
определено в заголовке «vector_math.h» SDK-примера кода CUDA, но я опишу его ниже, чтобы прояснить его (поскольку этот файл не является стандартной частью CUDA).
#include <iostream>
#include <thrust/device_vector.h>
#include <thrust/reduce.h>
using namespace thrust::placeholders;
__device__
int2 operator+(const int2& a, const int2& b) {
return make_int2(a.x+b.x, a.y+b.y);
}
#define N 20
int main()
{
thrust::host_vector<int2> a(N);
for (unsigned i=0; i<N; ++i) {
a[i].x = i;
a[i].y = i+1;
}
thrust::device_vector<int2> b = a;
int2 ave = thrust::reduce(b.begin(), b.end(), make_int2(0, 0), _1 + _2);
ave.x /= N;
ave.y /= N;
std::cout << ave.x << " " << ave.y << std::endl;
return 0;
}