Вы должны взглянуть на openMP для этого. Пример C / C ++ на этой странице похож на ваш код:
https://computing.llnl.gov/tutorials/openMP/#SECTIONS
#include <omp.h>
#define N 1000
main ()
{
int i;
float a[N], b[N], c[N], d[N];
/* Some initializations */
for (i=0; i < N; i++) {
a[i] = i * 1.5;
b[i] = i + 22.35;
}
#pragma omp parallel shared(a,b,c,d) private(i)
{
#pragma omp sections nowait
{
#pragma omp section
for (i=0; i < N; i++)
c[i] = a[i] + b[i];
#pragma omp section
for (i=0; i < N; i++)
d[i] = a[i] * b[i];
} /* end of sections */
} /* end of parallel section */
}
Если вы предпочитаете не использовать openMP, вы можете использовать либо pthreads, либо клонировать / ждать напрямую.
Независимо от того, какой маршрут вы выберете, вы просто делите свои массивы на куски, которые будет обрабатывать каждый поток. Если вся ваша обработка является чисто вычислительной (как предложено вашей примерной функцией), то вам следует преуспеть, чтобы иметь столько потоков, сколько у вас есть логических процессоров.
Существуют некоторые накладные расходы при добавлении потоков для параллельной обработки, поэтому убедитесь, что вы предоставили каждому потоку достаточно работы, чтобы восполнить его. Обычно так и будет, но если для каждого потока требуется только 1 вычисление, а вычисления не так сложны, вы можете на самом деле замедлить процесс. В этом случае у вас всегда может быть меньше потоков, чем у процессоров.
Если у вас есть какой-то ввод-вывод в вашей работе, вы можете обнаружить, что наличие большего количества потоков, чем процессоров, является выигрышем, потому что, хотя один поток может блокировать, ожидая, что какой-то ввод-вывод завершит другой поток, может выполнять свои вычисления. Вы должны быть осторожны, выполняя IO для одного и того же файла в потоках.