2017-01-04 2 views
1

Мне нужно вычислить среднее значение 2D-массива с использованием CUDA, но я не знаю, как это сделать. Я начал с сокращения столбцов после этого, я сделаю сумму результирующего массива, и на последнем шаге я вычислим среднее значение.Вычисление среднего для 2D-массива CUDA

Для этого мне нужно выполнить всю работу на устройстве сразу? или я просто делаю шаг за шагом, и каждый шаг требует от процессора и процессора GPU и обратно.

ответ

5

Если это простое среднее арифметическое всех элементов в 2D массива вы можете использовать тяги:

int* data; 
int num; 
get_data_from_library(&data, &num); 

thrust::device_vector<int> iVec(data, data+num); 

// transfer to device and compute sum 
int sum = thrust::reduce(iVec.begin(), iVec.end(), 0, thrust::plus<int>()); 
double mean = sum/(double)num; 

Если вы хотите, чтобы написать свое собственное ядро ​​- иметь в виду, что 2D массив по существу 1D массив разделен на рядовые размеры и пример с параллельным сокращением SDK: Whitepaper

+0

Спасибо @pSoLT за ваш ответ. Действительно ли я новый для CUDA, что я беру на себя из вашего ответа, так это, что у меня уже есть ядро? да, он оптимизирован, или я могу сделать лучшее ядро? что лучше? использовать это или создать собственное ядро? спасибо вам за продвинутый – alae

+0

Добро пожаловать в @alae. Существует библиотека под названием ['Thrust'] (http://docs.nvidia.com/cuda/thrust/), которая в основном представляет собой библиотеку шаблонов CUDA на основе STL. Это позволяет использовать CUDA в некоторых типичных проблемах без больших усилий (как вы, вероятно, заметили). 'Thrust' алгоритмы довольно оптимальны, поэтому я сомневаюсь, что вы можете добиться лучших результатов в сокращении массивов с помощью собственного ядра. Однако это было бы очень хорошим упражнением. – pSoLT

+0

Большое спасибо @pSoLT за ваш ответ довольно ясный и точный ^^ – alae

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