Я мало что сделал с OpenMP, но вот что я нашел, попробовав сам.
OpenMP позволяет сообщать компилятору, что все должно работать параллельно. Вот пример, который считается до 10000000000:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
long result = 0;
long i;
#pragma omp parallel for reduction(+: result)
for (i = 0; i < 10000000000; i++) {
result++;
}
printf("%li\n", result);
return EXIT_SUCCESS;
}
Это скомпилируется как обычная программа на C:
$ gcc -o OpenMPTest main.c
На моем компьютере он запускается за 30 секунд:
$ time ./OpenMPTest
10000000000
real 0m30.674s
user 0m30.628s
sys 0m0.014s
Добавление опции -fopenmp
в gcc включает поддержку OpenMP. Это все, что вам нужно для запуска цикла в нескольких потоках.
$ gcc -o OpenMPTest main.c -fopenmp
Это сокращает время работы до 15 секунд в двухъядерной системе:
$ time ./OpenMPTest
10000000000
real 0m15.840s
user 0m30.123s
sys 0m0.037s
Вот краткое описание того, что делает эта строка #pragma
:
#pragma omp
Это префикс для команд openmp.
parallel
Сообщает компилятору, что следующий оператор должен выполняться параллельно.
for reduction(+: result)
Объединяет все значения переменной result
из параллельных циклов в одно значение путем сложения. Удаление этого приводит к неправильному выводу окончательного номера.
Я знаю, что вы используете eclipse, но документы MSDN довольно хороши для описания OpenMP:
OpenMP в Visual C ++