выполнение кода медленнее в полупараллельном OpenMP - PullRequest
0 голосов
/ 27 марта 2019

добрый день. Я хочу реализовать внутренний продукт в 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

в любом случае, почему полупараллель самая медленная?

...