OpenMP странная эффективность - PullRequest
0 голосов
/ 12 мая 2018

Я играл с многопоточностью, решая квадратные уравнения, используя последовательный раздел для сравнения и несколько реализаций с использованием OpenMP API.

Для первой параллельной версии я просто распределял нагрузку выполнения, используя идентификатор потока:

delta = 0;
start = clock();

#pragma omp parallel num_threads(P) shared(x1, x2, b, a, c) private(delta)
{
    int threadID = omp_get_thread_num();

    for (int i = threadID; i < N; i += P)
    {
        delta = b[i] * b[i] - 4 * a[i] * c[i];
        if (delta >= 0)
        {
            x1[i] = (-b[i] + sqrt(delta)) / (2 * a[i]);
            x2[i] = (-b[i] - sqrt(delta)) / (2 * a[i]);
        }
    }
}

stop = clock();
durata_par = (double)(stop - start) / CLOCKS_PER_SEC;

printf("P_V1 %2.10f seconds\n", durata_par);
printf("P_V1 FA=%2.2f\n", durata_secv / durata_par);
printf("P_V1 E(%d)=%2.2f\n", P, (durata_secv / durata_par) / P);

и затем я попытался распределить итерации цикла с помощью #pragma omp for.

delta = 0;
start = clock();

#pragma omp parallel num_threads(P) shared(x1, x2, b, a, c) private(delta)
{
    int threadID = omp_get_thread_num();
    int numberofThreads = omp_get_num_threads();
    if (threadID == 0)
    {
        std::cout << "Number of threads: " << numberofThreads << std::endl;
    }

    #pragma omp for
    for (int i = 0; i < N; i++)
    {
        delta = b[i] * b[i] - 4 * a[i] * c[i];
        if (delta >= 0)
        {
            x1[i] = (-b[i] + sqrt(delta)) / (2 * a[i]);
            x2[i] = (-b[i] - sqrt(delta)) / (2 * a[i]);
        }
    }
}

stop = clock();
durata_par = (double)(stop - start) / CLOCKS_PER_SEC;

printf("P_V2 %2.10f seconds\n", durata_par);
printf("P_V2 FA=%2.2f\n", durata_secv / durata_par);
printf("P_V2 E(%d)=%2.2f\n", P, (durata_secv / durata_par) / P);

Пока все хорошо, но я заметил, что если я удалю присвоение значения дельте (delta = 0, из верхней части второй версии), это увеличит время выполнения и, кактакое падение коэффициента усиления (FA) от 4,4 до 1,4.

Есть ли объяснение этому поведению?(Не должно быть никакой разницы, потому что delta объявляется как private, и в любом случае он будет объявлен заново в каждом потоке)

...