параллельная обработка
От: Аноним  
Дата: 22.08.11 09:08
Оценка:
Добрый день,
подскажите, пожалуйста, как можно ускорить обработку данных:

Из устройства очень быстро льются данные двух типов — D (data) и C (control) таким образом:

ddddddddCddddddCdddddddddCCdd, cоотношение количества d:С = 250:1 (примерно).

я пишу обработчик (грубо: пребразование + фильтр), который должен обрабатывать все данные d, и выдавать преобразованные в том же порядке, в котором они пришли.

На обработку существенно влияют данные С, поэтому если какие-то из d пришли после C, то они должны быть обработаны после того, как обработается С (смысл данных или необходимость их обработки может поменяться).

Общая задача: решить проблему с обработкой больших потоков данных: возможна быстрая классификация пакетов на данные и управляющие пакеты (на типы D и С), но для дальнейшей обработки одного процессора не хватает, нужно разбрасывать на разные процессоры, а опыта подобного пока нет.

Мне видится такое решение:
— Создать пул потоков
— Данные типа Д нумеровать, передавать в свободные потоки для обработки, потоки будут складывать данные в очередь в соответствии с номерами.

Непонятно каким образом писать функции, которые будут работать в параллели, каким образом они будут получать данные (смотреть за какой-нибудь очередью? или данные в них можно передвать через что-то типа callback?). Каким механизмом затем функции-обработчики сообщают что данные обработаны?

У кого есть опыт решения таких задач (сетeвые адаптеpы)? Платформа — linux, язык c++98

Сейчас я смотрю в сторону boost io_service + thread group (http://think-async.com/Asio/Recipes)
или накопление пакетов d в памяти и вызов intel tbb::parallel_for (http://threadingbuildingblocks.org/) для них, но не очень пока понятно что из этого будет работать для этой задачи.

Было бы здорово узнать как ускорить обработку — ссылки, теория, опыт, ссылки на {опыт;теорию} приветствуются.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.