2012-04-19 4 views
0

У меня есть ядро, которое производит массив значений результата, и я хочу эффективно найти максимум этих значений. Массив инициализируется в начале ядра с некоторым отрицательным значением (например, -1). Ядро выполняется, например, по 5 блоков с 256 потоками.CUDA найти максимальное значение в общей памяти

Вот проблемы:

  1. Из-за моих данных, я должен прекратить потоки, которые не являются допустимыми, так что я иногда работаю с 256 нитями, иногда 50, 20 и так далее.

  2. В общей памяти записаны результаты из блока, но, как я уже упоминал, некоторый массив имеет 50 результатов, некоторые из которых имеют 256 результатов ... (так что общий массив выглядит так) 8,6,4,9,1, -1, -1, -1 ...

  3. В этом случае, как эффективно найти максимум в одном блоке?

Параллельное восстановление будет сложным на этих типах массивов, не так ли? Как это сделать?

+0

Done, sry Я совершенно новый :) – Hlavson

+0

Что вы имеете в виду с «прекратить» потоки? Сделайте «возврат» для этой темы? Потому что это не рекомендуется – pQB

+0

Рассматривали ли вы использование одной из бесплатных библиотек для поиска максимального значения (например, ArrayFire)? – arrayfire

ответ

2

Информация о вашем алгоритме недостаточно.

Что вы подразумеваете под n результатами? Являются ли проигнорированные значения в массиве равными -1 или вы используете динамическую внешнюю разделяемую память, а потоки записываются только в индекс n (звуки трудно реализовать)?

  • использовать фиксированный размер разделяемой памяти и набор игнорировали значения до -1 и по-прежнему выполнять параллельное сокращение, если поиск положительного максимума и его заполнения с -1 не имеет значения, или

  • Дон «т прекратить потоки, вместо того, чтобы установить флаг в другом массиве, если поток не должен выполнять дальнейшие расчеты и до сих пор делает параллельного снижение

+0

Я решил его с параллельным сокращением, с моими данными и -1 по индексам, где нет данных предыдущих вычислений, и он работает :-) – Hlavson

0

вы можете сделать сокращение в ядре (как сказал djmj), или вы можете использовать тягу объединить функтор и редукцию (например, tr ansform_reduce). Thrust включен в CUDA Toolkit, см. this page на примере transform_reduce.

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