добрый день.
Я хочу реализовать внутренний продукт в 3 метода:
1 - последовательный
2 - полупараллель
3 - полная параллель
полупараллель означает умножение параллельно и суммирование в последовательном.
вот мой код:
int main(int argc, char *argv[]) {
int *x, *y, *z, *w, xy_p, xy_s, xy_ss, i, N=5000;
double s, e;
x = (int *) malloc(sizeof(int)*N);
y = (int *) malloc(sizeof(int)*N);
z = (int *) malloc(sizeof(int)*N);
w = (int *) malloc(sizeof(int)*N);
for(i=0; i < N; i++) {
x[i] = rand();
y[i] = rand();
z[i] = 0;
}
s = omp_get_wtime();
xy_ss = 0;
for(i=0; i < N; i++)
{
xy_ss += x[i] * y[i];
}
e = omp_get_wtime() - s;
printf ( "[**] Sequential execution time is:\n%15.10f and <A,B> is %d\n", e, xy_ss );
s = omp_get_wtime();
xy_s = 0;
#pragma omp parallel for shared ( N, x, y, z ) private ( i )
for(i = 0; i < N; i++)
{
z[i] = x[i] * y[i];
}
for(i=0; i < N; i++)
{
xy_s += z[i];
}
e = omp_get_wtime() - s;
printf ( "[**] Half-Parallel execution time is:\n%15.10f and <A,B> is %d\n", e, xy_s );
s = omp_get_wtime();
xy_p = 0;
# pragma omp parallel shared (N, x, y) private(i)
# pragma omp for reduction ( + : xy_p )
for(i = 0; i < N; i++)
{
xy_p += x[i] * y[i];
}
e = omp_get_wtime() - s;
printf ( "[**] Full-Parallel execution time is:\n%15.10f and <A,B> is %d\n", e, xy_p );
}
поэтому у меня есть вопрос:
Сначала я хочу знать: мой код правильный? !!!!
второе: почему полупараллель быстрее последовательной ?!
третье: 5000 - это хороший размер для параллелизма?
и, наконец, почему последовательный самый быстрый? из-за 5000 ?!
Пример вывода:
Время последовательного выполнения:
0,0000196100 и точка -1081001655
Время полупараллельного выполнения:
0,0090819710 и точка -1081001655
Время полного параллельного выполнения:
0,0080959420 и точка -1081001655
и для N = 5000000
Время последовательного выполнения:
0,0150297650 и -1629514371
Время полупараллельного выполнения:
0,0292110600 и -1629514371
Время полного параллельного выполнения:
0,0072323760 и -1629514371
в любом случае, почему полупараллель самая медленная?