Почему при увеличении количества потоков время выполнения программы увеличивается?

Код – умножение матрицы на вектор.

Матрица и вектор меняются с каждой итерацией, сам код запускается на удаленном сервере через sbatch, так что в коде не прописано количество потоков. Добавлял директивы ко всем циклам, ничего особо не менялось.

Очень сильно новичок в C и в OpenMP.

В конкретном примере при 1 потоке - 8 секунд. При 8 потоках - 32 секунды.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <omp.h>

void multiplyMatrixVector(int m, double A[m][m], double b[m], double result[m]) {
    #pragma omp parallel for
    for (int i = 0; i < m; i++) {
        result[i] = 0;
        for (int j = 0; j < m; j++) {
            result[i] += A[i][j] * b[j];
        }
    }
}

void printMatrix(int m, double A[m][m]) {
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < m; j++) {
            printf("%5.2f ", A[i][j]);
        }
        printf("\n");
    }
}

void printVector(int m, double b[m]) {
    for (int i = 0; i < m; i++) {
        printf("%5.2f\n", b[i]);
    }
}

int main() {
    int N = 10000000; // кол-во итераций

    srand(time(NULL)); // инициализация рандомайзера

    double start_time = omp_get_wtime(); // старт времени

    for (int i = 0; i < N; i++) {
        int m = (i % 6) + 3;

        // Создание и инициализация матрицы A_i и вектора b_i случайными числами
        double A[m][m];
        double b[m];
        for (int j = 0; j < m; j++) {
            for (int k = 0; k < m; k++) {
                A[j][k] = (double)rand() / RAND_MAX * 10; // случайные числа от 0 до 10
            }
            b[j] = (double)rand() / RAND_MAX * 10; // случайные числа от 0 до 10
        }

        // Вычисление произведения матрицы на вектор
        double result[m];
        multiplyMatrixVector(m, A, b, result);

     
    }

    double end_time = omp_get_wtime(); // конец времени
    printf("Total execution time: %f seconds\n", end_time - start_time);

    return 0;
}

Ответы (0 шт):