#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#define N 1000 // Matrix size
// Function to initialize a matrix
void initialize_matrix(double *matrix, int rows, int cols) {
#pragma omp parallel for
for (int i = 0; i < rows * cols; i++) {
matrix
[i
] = (double)(rand() % 100) / 100.0; // Random values between 0 and 1 }
}
// Function to initialize a vector
void initialize_vector(double *vector, int size) {
#pragma omp parallel for
for (int i = 0; i < size; i++) {
vector
[i
] = (double)(rand() % 100) / 100.0; // Random values between 0 and 1 }
}
// Function to perform matrix-vector multiplication
void matrix_vector_multiply(double *matrix, double *vector, double *result, int rows, int cols) {
#pragma omp parallel for
for (int i = 0; i < rows; i++) {
result[i] = 0.0; // Initialize result element to 0
for (int j = 0; j < cols; j++) {
result[i] += matrix[i * cols + j] * vector[j];
}
}
}
int main() {
double *matrix, *vector, *result;
int rows = N, cols = N;
matrix
= (double *)malloc(rows
* cols
* sizeof(double)); vector
= (double *)malloc(cols
* sizeof(double)); result
= (double *)malloc(rows
* sizeof(double));
// Initialize matrix and vector with random values
initialize_matrix(matrix, rows, cols);
initialize_vector(vector, cols);
double start_time = omp_get_wtime(); // Start timer
// Perform matrix-vector multiplication
matrix_vector_multiply(matrix, vector, result, rows, cols);
double end_time = omp_get_wtime(); // Stop timer
printf("Time taken: %f seconds\n", end_time
- start_time
);
// Free allocated memory
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+IAojaW5jbHVkZSA8c3RkbGliLmg+IAojaW5jbHVkZSA8b21wLmg+IAogCiNkZWZpbmUgTiAxMDAwIC8vIE1hdHJpeCBzaXplIAogCi8vIEZ1bmN0aW9uIHRvIGluaXRpYWxpemUgYSBtYXRyaXggCnZvaWQgaW5pdGlhbGl6ZV9tYXRyaXgoZG91YmxlICptYXRyaXgsIGludCByb3dzLCBpbnQgY29scykgeyAKICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciAKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93cyAqIGNvbHM7IGkrKykgeyAKICAgICAgICBtYXRyaXhbaV0gPSAoZG91YmxlKShyYW5kKCkgJSAxMDApIC8gMTAwLjA7IC8vIFJhbmRvbSB2YWx1ZXMgYmV0d2VlbiAwIGFuZCAxIAogICAgfSAKfSAKIAovLyBGdW5jdGlvbiB0byBpbml0aWFsaXplIGEgdmVjdG9yIAp2b2lkIGluaXRpYWxpemVfdmVjdG9yKGRvdWJsZSAqdmVjdG9yLCBpbnQgc2l6ZSkgeyAKICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciAKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7IAogICAgICAgIHZlY3RvcltpXSA9IChkb3VibGUpKHJhbmQoKSAlIDEwMCkgLyAxMDAuMDsgLy8gUmFuZG9tIHZhbHVlcyBiZXR3ZWVuIDAgYW5kIDEgCiAgICB9IAp9IAogCi8vIEZ1bmN0aW9uIHRvIHBlcmZvcm0gbWF0cml4LXZlY3RvciBtdWx0aXBsaWNhdGlvbiAKdm9pZCBtYXRyaXhfdmVjdG9yX211bHRpcGx5KGRvdWJsZSAqbWF0cml4LCBkb3VibGUgKnZlY3RvciwgZG91YmxlICpyZXN1bHQsIGludCByb3dzLCBpbnQgY29scykgeyAKICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciAKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7IAogICAgICAgIHJlc3VsdFtpXSA9IDAuMDsgLy8gSW5pdGlhbGl6ZSByZXN1bHQgZWxlbWVudCB0byAwIAogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29sczsgaisrKSB7IAogICAgICAgICAgICByZXN1bHRbaV0gKz0gbWF0cml4W2kgKiBjb2xzICsgal0gKiB2ZWN0b3Jbal07IAogICAgICAgIH0gCiAgICB9IAp9IAogCmludCBtYWluKCkgeyAKICAgIGRvdWJsZSAqbWF0cml4LCAqdmVjdG9yLCAqcmVzdWx0OyAKICAgIGludCByb3dzID0gTiwgY29scyA9IE47IAogCiAgICBtYXRyaXggPSAoZG91YmxlICopbWFsbG9jKHJvd3MgKiBjb2xzICogc2l6ZW9mKGRvdWJsZSkpOyAKICAgIHZlY3RvciA9IChkb3VibGUgKiltYWxsb2MoY29scyAqIHNpemVvZihkb3VibGUpKTsgCiAgICByZXN1bHQgPSAoZG91YmxlICopbWFsbG9jKHJvd3MgKiBzaXplb2YoZG91YmxlKSk7IAogCiAgICAvLyBJbml0aWFsaXplIG1hdHJpeCBhbmQgdmVjdG9yIHdpdGggcmFuZG9tIHZhbHVlcyAKICAgIGluaXRpYWxpemVfbWF0cml4KG1hdHJpeCwgcm93cywgY29scyk7IAogICAgaW5pdGlhbGl6ZV92ZWN0b3IodmVjdG9yLCBjb2xzKTsgCiAKICAgIGRvdWJsZSBzdGFydF90aW1lID0gb21wX2dldF93dGltZSgpOyAvLyBTdGFydCB0aW1lciAKIAogICAgLy8gUGVyZm9ybSBtYXRyaXgtdmVjdG9yIG11bHRpcGxpY2F0aW9uIAogICAgbWF0cml4X3ZlY3Rvcl9tdWx0aXBseShtYXRyaXgsIHZlY3RvciwgcmVzdWx0LCByb3dzLCBjb2xzKTsgCiAKICAgIGRvdWJsZSBlbmRfdGltZSA9IG9tcF9nZXRfd3RpbWUoKTsgLy8gU3RvcCB0aW1lciAKIAogICAgcHJpbnRmKCJUaW1lIHRha2VuOiAlZiBzZWNvbmRzXG4iLCBlbmRfdGltZSAtIHN0YXJ0X3RpbWUpOyAKIAogICAgLy8gRnJlZSBhbGxvY2F0ZWQgbWVtb3J5IAogICAgZnJlZShtYXRyaXgpOyAKICAgIGZyZWUodmVjdG9yKTsgCiAgICBmcmVlKHJlc3VsdCk7IAogCiAgICByZXR1cm4gMDsgCn0=