#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <omp.h>
#define N 500 // Define matrix size
using namespace std;
// Function to generate a random matrix
void generateMatrix(vector<vector<int>>& matrix) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
matrix[i][j] = rand() % 10; // Random values from 0 to 9
}
}
}
// Function to multiply matrices using OpenMP
void multiplyMatrices(const vector<vector<int>>& A, const vector<vector<int>>& B, vector<vector<int>>& C) {
#pragma omp parallel for collapse(2)
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
C[i][j] = 0;
for (int k = 0; k < N; k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
}
int main() {
srand(time(0));
vector<vector<int>> A(N, vector<int>(N));
vector<vector<int>> B(N, vector<int>(N));
vector<vector<int>> C(N, vector<int>(N, 0));
generateMatrix(A);
generateMatrix(B);
clock_t start = clock(); // Use clock() instead of omp_get_wtime()
multiplyMatrices(A, B, C);
clock_t end = clock(); // End time
double time_taken = double(end - start) / CLOCKS_PER_SEC;
cout << "Matrix multiplication completed in " << time_taken << " seconds." << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGN0aW1lPgojaW5jbHVkZSA8b21wLmg+CgojZGVmaW5lIE4gNTAwICAvLyBEZWZpbmUgbWF0cml4IHNpemUKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBGdW5jdGlvbiB0byBnZW5lcmF0ZSBhIHJhbmRvbSBtYXRyaXgKdm9pZCBnZW5lcmF0ZU1hdHJpeCh2ZWN0b3I8dmVjdG9yPGludD4+JiBtYXRyaXgpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOOyBqKyspIHsKICAgICAgICAgICAgbWF0cml4W2ldW2pdID0gcmFuZCgpICUgMTA7ICAvLyBSYW5kb20gdmFsdWVzIGZyb20gMCB0byA5CiAgICAgICAgfQogICAgfQp9CgovLyBGdW5jdGlvbiB0byBtdWx0aXBseSBtYXRyaWNlcyB1c2luZyBPcGVuTVAKdm9pZCBtdWx0aXBseU1hdHJpY2VzKGNvbnN0IHZlY3Rvcjx2ZWN0b3I8aW50Pj4mIEEsIGNvbnN0IHZlY3Rvcjx2ZWN0b3I8aW50Pj4mIEIsIHZlY3Rvcjx2ZWN0b3I8aW50Pj4mIEMpIHsKICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBjb2xsYXBzZSgyKQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgewogICAgICAgICAgICBDW2ldW2pdID0gMDsKICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBOOyBrKyspIHsKICAgICAgICAgICAgICAgIENbaV1bal0gKz0gQVtpXVtrXSAqIEJba11bal07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCmludCBtYWluKCkgewogICAgc3JhbmQodGltZSgwKSk7CgogICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBBKE4sIHZlY3RvcjxpbnQ+KE4pKTsKICAgIHZlY3Rvcjx2ZWN0b3I8aW50Pj4gQihOLCB2ZWN0b3I8aW50PihOKSk7CiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IEMoTiwgdmVjdG9yPGludD4oTiwgMCkpOwoKICAgIGdlbmVyYXRlTWF0cml4KEEpOwogICAgZ2VuZXJhdGVNYXRyaXgoQik7CgogICAgY2xvY2tfdCBzdGFydCA9IGNsb2NrKCk7IC8vIFVzZSBjbG9jaygpIGluc3RlYWQgb2Ygb21wX2dldF93dGltZSgpCgogICAgbXVsdGlwbHlNYXRyaWNlcyhBLCBCLCBDKTsKCiAgICBjbG9ja190IGVuZCA9IGNsb2NrKCk7IC8vIEVuZCB0aW1lCgogICAgZG91YmxlIHRpbWVfdGFrZW4gPSBkb3VibGUoZW5kIC0gc3RhcnQpIC8gQ0xPQ0tTX1BFUl9TRUM7CiAgICBjb3V0IDw8ICJNYXRyaXggbXVsdGlwbGljYXRpb24gY29tcGxldGVkIGluICIgPDwgdGltZV90YWtlbiA8PCAiIHNlY29uZHMuIiA8PCBlbmRsOwoKICAgIHJldHVybiAwOwp9Cg==