да на самом деле многие со зависимые вещи параллелятся плохо, пока не произойдет расчет одного, второе просто не посчитать...т.к. нужно ждать результат первых расчетов.
Ну да, распараллеливание - процесс далеко не механический и имеющий целый ряд существенных ограничений.
Но все-так хотелось бы на конкретном примере.
Вот как я себе представляю: СТЕРЕО - без проблем параллелится на 2 ядра. Больше двух - уже вопрос.
Значит, надо подходить с другой стороны.
Обработка звуков - последовательное применения большого количества разных эффектов. А каждый эффект реализуется своим алгоритмом, который, как правило, также можно разделить на несколько стадий.
Тогда почему бы не представить обработку звука следующим образом:
1. Ядро 1 делает 1-ю стадию эффекта 1 и передает результат ядру 2,
2. Ядро 2 делает 2-ю стадию эффекта 1 и передает результат ядру 3, а ядро 1 в это время обрабатывает уже следующий сэмпл,
3. Ядро 3 делает 3-ю стадию эффекта 1 и передает результат ядру 4, а ядра 1 и 2 в это время обрабатывают уже следующие два сэмпла,
4. Ядро 4 делает 1-ю стадию эффекта 2 и передает результат ядру 5, а ядра 1-3 в это время обрабатывают уже следующие три сэмпла,
...
В результате каждое из ядер имеет нагрузку, которую вполне можно выполнить за отведенное время, например, за 1с/96000 = 10.4 мкс или при частоте 1 ГГц - за 10400 тактов.
Тут, правда возникают два обстоятельства:
- тактика распараллеливания сильно зависит от количества, последовательности эффектов, а также от сложности составляющих их алгоритмов.
- возникает вопрос с операцией "передает", т.к. на современных многоядерных устройствах это довольно длительная операция, которая может свести на нет выигрыш от всех остальных операций. Впрочем, вопрос упирается в архитектуру: ведь DSP именно так и работают.