Мне нужно выполнить параллельное сокращение, чтобы найти минимальное или максимальное значение массива на устройстве CUDA. Я нашел для этого хорошую библиотеку под названием «Траст». Кажется, что вы можете выполнять параллельное сокращение массивов в памяти хоста. Мои данные хранятся в памяти устройства. Возможно ли сократить количество данных в памяти устройства? Я не могу понять, как это сделать. Вот документация для Thrust: http://code.google.com/p/thrust/wiki/QuickStartGuide#Reductions. Благодарю всех вас.Параллельное сокращение на CUDA с массивом в устройстве
1
A
ответ
7
Вы можете делать сокращения тяги на массивах, которые уже находятся в памяти устройства. Все, что вам нужно сделать, это обернуть указатели устройств внутри thrust::device_pointer
контейнеров и вызвать одну из процедур сокращения, так же, как показано на вики вы связаны с:
// assume this is a valid device allocation holding N words of data
int * dmem;
// Wrap raw device pointer
thrust::device_ptr<int> dptr(dmem);
// use max_element for reduction
thrust::device_ptr<int> dresptr = thrust::max_element(dptr, dptr+N);
// retrieve result from device (if required)
int max_value = dresptr[0];
Обратите внимание, что возвращаемое значение также device_ptr
, так что вы можете использовать его непосредственно в других ядрах с помощью thrust::raw_pointer_cast
:
int * dres = thrust::raw_pointer_cast(dresptr);
1
Если передача или любая другая библиотека не предоставляет вам такую услугу, вы все равно можете создать это ядро самостоятельно.
У Марка Харриса есть отличный учебник по параллельному сокращению и его оптимизации на cuda. Следуя его слайдам, это не так сложно реализовать и изменить его для ваших нужд.
Я знаю, но я читал, что thurst параллельного сокращения очень быстро ... – Hlavson