#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#ifdef _OPENMP
#include <omp.h>
#endif
#define N 500 // Define the size of the matrix
void initializeMatrix(int matrix[N][N]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
matrix
[i
][j
] = rand() % 10; // Random values between 0 and 9 }
}
}
void printMatrix(int matrix[N][N]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
}
}
}
void multiplyMatrices(int A[N][N], int B[N][N], int C[N][N]) {
#ifdef _OPENMP
#pragma omp parallel for collapse(2)
#endif
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() {
int A[N][N], B[N][N], C[N][N] = {0};
initializeMatrix(A);
initializeMatrix(B);
double start, end;
#ifdef _OPENMP
start = omp_get_wtime();
#else
start
= (double)clock() / CLOCKS_PER_SEC
; #endif
multiplyMatrices(A, B, C);
#ifdef _OPENMP
end = omp_get_wtime();
#else
end
= (double)clock() / CLOCKS_PER_SEC
; #endif
printf("Time taken for parallel matrix multiplication: %f seconds.\n", end
- start
);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2lmZGVmIF9PUEVOTVAKI2luY2x1ZGUgPG9tcC5oPgojZW5kaWYKCiNkZWZpbmUgTiA1MDAgIC8vIERlZmluZSB0aGUgc2l6ZSBvZiB0aGUgbWF0cml4Cgp2b2lkIGluaXRpYWxpemVNYXRyaXgoaW50IG1hdHJpeFtOXVtOXSkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgewogICAgICAgICAgICBtYXRyaXhbaV1bal0gPSByYW5kKCkgJSAxMDsgLy8gUmFuZG9tIHZhbHVlcyBiZXR3ZWVuIDAgYW5kIDkKICAgICAgICB9CiAgICB9Cn0KCnZvaWQgcHJpbnRNYXRyaXgoaW50IG1hdHJpeFtOXVtOXSkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgewogICAgICAgICAgICBwcmludGYoIiVkICIsIG1hdHJpeFtpXVtqXSk7CiAgICAgICAgfQogICAgICAgIHByaW50ZigiXG4iKTsKICAgIH0KfQoKdm9pZCBtdWx0aXBseU1hdHJpY2VzKGludCBBW05dW05dLCBpbnQgQltOXVtOXSwgaW50IENbTl1bTl0pIHsKICAgICNpZmRlZiBfT1BFTk1QCiAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3IgY29sbGFwc2UoMikKICAgICNlbmRpZgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgewogICAgICAgICAgICBDW2ldW2pdID0gMDsKICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBOOyBrKyspIHsKICAgICAgICAgICAgICAgIENbaV1bal0gKz0gQVtpXVtrXSAqIEJba11bal07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCmludCBtYWluKCkgewogICAgc3JhbmQodGltZSgwKSk7CiAgICAKICAgIGludCBBW05dW05dLCBCW05dW05dLCBDW05dW05dID0gezB9OwogICAgCiAgICBpbml0aWFsaXplTWF0cml4KEEpOwogICAgaW5pdGlhbGl6ZU1hdHJpeChCKTsKICAgIAogICAgZG91YmxlIHN0YXJ0LCBlbmQ7CiAgICAjaWZkZWYgX09QRU5NUAogICAgc3RhcnQgPSBvbXBfZ2V0X3d0aW1lKCk7CiAgICAjZWxzZQogICAgc3RhcnQgPSAoZG91YmxlKWNsb2NrKCkgLyBDTE9DS1NfUEVSX1NFQzsKICAgICNlbmRpZgogICAgCiAgICBtdWx0aXBseU1hdHJpY2VzKEEsIEIsIEMpOwogICAgCiAgICAjaWZkZWYgX09QRU5NUAogICAgZW5kID0gb21wX2dldF93dGltZSgpOwogICAgI2Vsc2UKICAgIGVuZCA9IChkb3VibGUpY2xvY2soKSAvIENMT0NLU19QRVJfU0VDOwogICAgI2VuZGlmCiAgICAKICAgIHByaW50ZigiVGltZSB0YWtlbiBmb3IgcGFyYWxsZWwgbWF0cml4IG11bHRpcGxpY2F0aW9uOiAlZiBzZWNvbmRzLlxuIiwgZW5kIC0gc3RhcnQpOwogICAgCiAgICByZXR1cm4gMDsKfQo=