matrix

 avatar
unknown
plain_text
a month ago
2.1 kB
4
Indexable
#include <iostream>
#include <cstdlib>
#include <pthread.h>
#include <ctime>

using namespace std;

#define N 500  
#define NUM_THREADS 4 
int matrixA[N][N], matrixB[N][N], resultSeq[N][N], resultPar[N][N];

void initializeMatrix(int matrix[N][N]) {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            matrix[i][j] = rand() % 100;  
        }
    }
}

void multiplySequential() {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            resultSeq[i][j] = 0;
            for (int k = 0; k < N; k++) {
                resultSeq[i][j] += matrixA[i][k] * matrixB[k][j];
            }
        }
    }
}

struct ThreadData {
    int startRow;
    int endRow;
};

void* multiplyParallel(void* arg) {
    ThreadData* data = (ThreadData*)arg;

    for (int i = data->startRow; i < data->endRow; i++) {
        for (int j = 0; j < N; j++) {
            resultPar[i][j] = 0;
            for (int k = 0; k < N; k++) {
                resultPar[i][j] += matrixA[i][k] * matrixB[k][j];
            }
        }
    }

    pthread_exit(NULL);
}

double getTime() {
    return (double)clock() / CLOCKS_PER_SEC;
}

int main() {
    srand(time(0));

    initializeMatrix(matrixA);
    initializeMatrix(matrixB);

    double start, end;

 
    start = getTime();
    multiplySequential();
    end = getTime();
    cout << "Sequential Execution Time: " << (end - start) << " seconds" << endl;

    
    pthread_t threads[NUM_THREADS];
    ThreadData threadData[NUM_THREADS];
    int rowsPerThread = N / NUM_THREADS;

    start = getTime();
    for (int i = 0; i < NUM_THREADS; i++) {
        threadData[i].startRow = i * rowsPerThread;
        threadData[i].endRow = (i == NUM_THREADS - 1) ? N : (i + 1) * rowsPerThread;
        pthread_create(&threads[i], NULL, multiplyParallel, (void*)&threadData[i]);
    }

    for (int i = 0; i < NUM_THREADS; i++) {
        pthread_join(threads[i], NULL);
    }
    end = getTime();

    cout << "Parallel Execution Time: " << (end - start) << " seconds" << endl;

    return 0;
}
Editor is loading...
Leave a Comment