Почему при увеличении количества потоков время выполнения программы увеличивается?
Код – умножение матрицы на вектор.
Матрица и вектор меняются с каждой итерацией, сам код запускается на удаленном сервере через 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;
}