я новичок в OpenMp и хотел использовать его в более крупном проекте и сделал это, но безуспешно. Каждая итерация параллельного цикла for должна вычислять последовательную декомпозицию холецкого матрицы, но при параллельном коде время было примерно в 10 раз меньше.
Поэтому я написал небольшой пример кода, чтобы лучше понять openmp. Но почему-то мой код openmp медленнее, чем последовательный код (только без параллельной прагмы). Вот простой код:
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main ( )
{
clock_t start,ende;
double totalTime;
int i, n = 100000000;
double s = 1.23;
double *x;
double *y;
x = (double *) calloc(n, sizeof(double));
y = (double *) calloc(n, sizeof(double));
for ( i = 0; i < n; i++ ){
x[i] = ( double ) ( ( i + 1 ) % 17 );
y[i] = ( double ) ( ( i + 1 ) % 31 );
}
start = clock();
#pragma omp parallel for num_threads(4) private(i)
for ( i = 0; i < n; i++ ){
x[i] = x[i] + s * y[i];
}
ende = clock();
totalTime = (ende - start)/(double)CLOCKS_PER_SEC;
printf("Zeit: %.10f s\n",totalTime);
free(x);
free(y);
return 0;
}
Мое время составляет 0,625 с с параллельным кодом и 0,328 с с последовательным кодом. По мере того, как я спускаюсь с numthreads(), я получаю лучшие времена. 0,453 с для numthreads(2) и 0,344 с для numthreads(1).
Может ли кто-нибудь помочь мне с небольшим примером кода и почему разложение холецкого не работает?