Я пытаюсь распараллелить функцию свертки в C. Здесь исходная функция, которая свертывает два массива 64-битных поплавков:
void convolve(const Float64 *in1,
UInt32 in1Len,
const Float64 *in2,
UInt32 in2Len,
Float64 *results)
{
UInt32 i, j;
for (i = 0; i < in1Len; i++) {
for (j = 0; j < in2Len; j++) {
results[i+j] += in1[i] * in2[j];
}
}
}
Чтобы разрешить concurrency (без семафоров), я создал функцию, которая вычисляет результат для определенной позиции в массиве results
:
void convolveHelper(const Float64 *in1,
UInt32 in1Len,
const Float64 *in2,
UInt32 in2Len,
Float64 *result,
UInt32 outPosition)
{
UInt32 i, j;
for (i = 0; i < in1Len; i++) {
if (i > outPosition)
break;
j = outPosition - i;
if (j >= in2Len)
continue;
*result += in1[i] * in2[j];
}
}
Проблема заключается в том, что использование convolveHelper
замедляет код примерно в 3,5 раза (при запуске в одном потоке).
Любые идеи о том, как я могу ускорить convolveHelper
, сохраняя при этом безопасность потоков?