2012-04-12 5 views
1

Мне нужно выполнить параллельное сокращение, чтобы найти минимальное или максимальное значение массива на устройстве CUDA. Я нашел для этого хорошую библиотеку под названием «Траст». Кажется, что вы можете выполнять параллельное сокращение массивов в памяти хоста. Мои данные хранятся в памяти устройства. Возможно ли сократить количество данных в памяти устройства? Я не могу понять, как это сделать. Вот документация для Thrust: http://code.google.com/p/thrust/wiki/QuickStartGuide#Reductions. Благодарю всех вас.Параллельное сокращение на CUDA с массивом в устройстве

ответ

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. Следуя его слайдам, это не так сложно реализовать и изменить его для ваших нужд.

+0

Я знаю, но я читал, что thurst параллельного сокращения очень быстро ... – Hlavson

 Смежные вопросы

  • Нет связанных вопросов^_^