Это очень поздний ответ, предоставленный здесь, чтобы удалить этот вопрос из списка без ответа. Я уверен, что ОП уже нашел решение (с мая 2012 года :-)), но я считаю, что следующее может быть полезно другим пользователям.
Как указал @talonmies, проблема может быть решена с помощью плавного сокращения сбора. Решение действительно представляет собой применение permutation_iterator
и reduce
Терста. permutation_iterator
позволяет (неявно) переупорядочивать целевой массив x
в соответствии с индексами в массиве indices
. reduce
выполняет суммирование (неявно) переупорядоченного массива.
Это приложение является частью документации Thrust, приведенной ниже для удобства.
#include <thrust/iterator/permutation_iterator.h>
#include <thrust/reduce.h>
#include <thrust/device_vector.h>
// this example fuses a gather operation with a reduction for
// greater efficiency than separate gather() and reduce() calls
int main(void)
{
// gather locations
thrust::device_vector<int> map(4);
map[0] = 3;
map[1] = 1;
map[2] = 0;
map[3] = 5;
// array to gather from
thrust::device_vector<int> source(6);
source[0] = 10;
source[1] = 20;
source[2] = 30;
source[3] = 40;
source[4] = 50;
source[5] = 60;
// fuse gather with reduction:
// sum = source[map[0]] + source[map[1]] + ...
int sum = thrust::reduce(thrust::make_permutation_iterator(source.begin(), map.begin()),
thrust::make_permutation_iterator(source.begin(), map.end()));
// print sum
std::cout << "sum is " << sum << std::endl;
return 0;
}
В приведенном выше примере map
играет роль indices
, а source
играет роль x
.
Что касается дополнительного вопроса в вашем комментарии (повторение сокращенного количества терминов), достаточно будет изменить следующую строку
int sum = thrust::reduce(thrust::make_permutation_iterator(source.begin(), map.begin()),
thrust::make_permutation_iterator(source.begin(), map.end()));
to
int sum = thrust::reduce(thrust::make_permutation_iterator(source.begin(), map.begin()),
thrust::make_permutation_iterator(source.begin(), map.begin()+N));
если вы хотите выполнить итерацию только по первым N
элементам массива индексации map
.
Наконец, что касается возможности использования global_array
с хоста, вы должны заметить, что это вектор, находящийся на устройстве, поэтому вам нужен cudaMemcpyFromSymbol
, чтобы сначала переместить его на хост.
person
Vitality
schedule
26.03.2014
support
представляет собой слитный сбор-сокращение) или это что-то еще? Есть ли какая-то причина, по которой вы решили показатьsupport
как функцию устройства, или это в принципе не имеет значения? - person talonmies   schedule 04.05.2012