Това е много късен отговор, предоставен тук, за да премахнете този въпрос от списъка без отговор. Сигурен съм, че OP вече е намерил решение (от май 2012 г. :-)), но вярвам, че следното може да бъде полезно за други потребители.
Както беше посочено от @talonmies, проблемът може да бъде решен чрез слято събиране-намаляване. Решението наистина е приложение на permutation_iterator
и reduce
на Thurst. 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