У меня есть реализация цифрового бесселевого фильтра, который является узким местом производительности для моей программы. Я хотел бы распараллелить основной цикл с помощью OpenMP.Параллельный цикл с использованием OpenMP, когда итерации цикла не являются независимыми
Функция принимает входной массив paddedsignal
и массивы коэффициентов фильтра dcof
и ccof
и производит временный массив temp
который фильтруют. Основной цикл этого процесса выглядит следующим образом:
for (i=order; i<end; i++)
{
temp[i] = ccof[0]*paddedsignal[i];
for (p=1; p<=order; p++)
{
temp[i] += ccof[p]*paddedsignal[i-p] - dcof[p]*temp[i-p];
}
}
В частности, обратите внимание, что значение temp[i]
зависит от предыдущих значений temp[i-p]
. Это смешивает простую директиву #pragma omp for
, так как значение temp[i]
вблизи границ между разделами массива, которое будет обрабатываться разными потоками, будет иметь проблемы с состоянием гонки. В основном, если поток 1 принимает индексы между 0-99, а поток 2 принимает 100-199, значение в 100 будет неправильным, так как оно будет вычислено до значения в 99, от которого это зависит.
Есть ли способ спасти эту ситуацию? Я отчаиваюсь относительно того, что я могу сделать, чтобы распараллелить это, поскольку тот факт, что отфильтрованные значения зависят от соседних значений, делает его по сути серийным вычислением. Есть ли способ обойти это?
Это серийный расчет. Единственный способ ускорить его работу - получить более быстрый процессор. Альтернативой может быть использование другого типа фильтра, который более поддается параллельному исполнению. Или, если данные, которые нужно отфильтровать, могут быть выгружены каким-то образом, у вас есть разные партии, которые фильтруются разными потоками. – bazza
Я думаю, что пакетная фильтрация будет способ пойти – KBriggs
Внутренний цикл может быть как [префикс сумма как проблема] (http://stackoverflow.com/a/35840595/2542702)? –