#include <omp.h>
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
const int N = 800;
void matrix_vector_mult(float A[][N], float B[], float C[], int n, int num_threads) {
int i, j;
float sum;
omp_set_num_threads(num_threads);
#pragma omp parallel for private(j, sum)
for (i = 0; i < n; i++) {
sum = 0.0;
for (j = 0; j < n; j++) {
sum += A[i][j] * B[j];
}
C[i] = sum;
}
}
int main() {
float A[N][N], B[N], C[N];
int i, j, num_threads;
double start_time, end_time;
// Initialize matrix A and vector B with random values
srand(time(0));
for (i = 0; i < N; i++) {
B[i] = (float)rand() / RAND_MAX;
for (j = 0; j < N; j++) {
A[i][j] = (float)rand() / RAND_MAX;
}
}
// Perform matrix-vector multiplication using OpenMP multi-threading with 1, 2, 4, 8, 12, and 16 threads
for (num_threads = 1; num_threads <= 16; num_threads *= 2) {
start_time = omp_get_wtime();
matrix_vector_mult(A, B, C, N, num_threads);
end_time = omp_get_wtime();
cout << "Time taken with " << num_threads << " threads: " << end_time - start_time << " seconds" << endl;
}
return 0;
}
|