#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define size 10
#define M size
#define K size
#define N size
// int A [M][K] = { {1,4}, {2,5}, {3,6} };
// int B [K][N] = { {8,7,6}, {5,4,3} };
int A [M][K];
int B [K][N] ;
int C [M][N];
struct v {
int i; /* row */
int j; /* column */
};
void *runner(void *param); /* the thread */
void fill_matrix(int matrix[][N], int row, int column)
{
// int (*matrix)[row] = malloc(sizeof(int[row][column]));
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
{
matrix
[i
][j
] = (rand() % (100-0+1)) + 1; }
}
return;
}
int main(int argc, char *argv[]) {
int i,j, count = 0;
// int (*A)[M] = malloc(sizeof(int[M][K]));
// int (*B)[K] = malloc(sizeof(int[K][N]));
// A = (int*)malloc(sizeof(A));
fill_matrix(A,M,K);
fill_matrix(B,K,N);
// pthread_t thread_array[M*N];
pthread_t thread_array[M*N]; //malloc(M*N * sizeof(pthread_t));
pthread_attr_t attr;
pthread_attr_init(&attr);
for(i = 0; i < M; i++) {
for(j = 0; j < N; j++) {
//Assign a row and column for each thread
struct v
*data
= (struct v
*) malloc(sizeof(struct v
)); data->i = i;
data->j = j;
/* Now create the thread passing it data as a parameter */
//pthread_t tid; //Thread ID
//pthread_attr_t attr; //Set of thread attributes
//Get the default attributes
//pthread_attr_init(&attr);
//Create the thread
pthread_create(&thread_array[count],&attr,runner,data);
//Make sure the parent waits for all thread to complete
//pthread_join(tid, NULL);
count++;
}
}
for(int k =0;k<M*N;k++){
pthread_join(thread_array[k],NULL);
}
printf("%f\n",(float)(end
-start
)/CLOCKS_PER_SEC
);
//Print out the resulting matrix
//for(i = 0; i < M; i++) {
// for(j = 0; j < N; j++) {
// printf("%d ", C[i][j]);
// }
// printf("\n");
// }
}
//The thread will begin control in this function
void *runner(void *param) {
struct v *data = param; // the structure that holds our data
int n, sum = 0; //the counter and sum
//Row multiplied by column
for(n = 0; n< K; n++){
sum += A[data->i][n] * B[n][data->j];
}
//assign the sum to its coordinate
C[data->i][data->j] = sum;
//Exit the thread
pthread_exit(0);
}
I2luY2x1ZGUgPHB0aHJlYWQuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2RlZmluZSBzaXplIDEwCiNkZWZpbmUgTSBzaXplCiNkZWZpbmUgSyBzaXplCiNkZWZpbmUgTiBzaXplCgovLyBpbnQgQSBbTV1bS10gPSB7IHsxLDR9LCB7Miw1fSwgezMsNn0gfTsKLy8gaW50IEIgW0tdW05dID0geyB7OCw3LDZ9LCB7NSw0LDN9IH07CgppbnQgQSBbTV1bS107CmludCBCIFtLXVtOXSA7CmludCBDIFtNXVtOXTsKCnN0cnVjdCB2IHsKICAgaW50IGk7IC8qIHJvdyAqLwogICBpbnQgajsgLyogY29sdW1uICovCn07Cgp2b2lkICpydW5uZXIodm9pZCAqcGFyYW0pOyAvKiB0aGUgdGhyZWFkICovCgp2b2lkIGZpbGxfbWF0cml4KGludCBtYXRyaXhbXVtOXSwgaW50IHJvdywgaW50IGNvbHVtbikKewogICAvLyBpbnQgKCptYXRyaXgpW3Jvd10gPSBtYWxsb2Moc2l6ZW9mKGludFtyb3ddW2NvbHVtbl0pKTsKICBmb3IgKGludCBpID0gMDsgaSA8IHJvdzsgaSsrKQogIHsKICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29sdW1uOyBqKyspCiAgICB7CiAgICAgIG1hdHJpeFtpXVtqXSA9IChyYW5kKCkgJSAoMTAwLTArMSkpICsgMTsKICAgIH0KICB9CiAgcmV0dXJuOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CgogICBpbnQgaSxqLCBjb3VudCA9IDA7CiAgIC8vIGludCAoKkEpW01dID0gbWFsbG9jKHNpemVvZihpbnRbTV1bS10pKTsKICAgLy8gaW50ICgqQilbS10gPSBtYWxsb2Moc2l6ZW9mKGludFtLXVtOXSkpOwogICAvLyBBID0gKGludCopbWFsbG9jKHNpemVvZihBKSk7CgogICBmaWxsX21hdHJpeChBLE0sSyk7CiAgIGZpbGxfbWF0cml4KEIsSyxOKTsKICAgY2xvY2tfdCBzdGFydCA9IGNsb2NrKCk7CiAgLy8gcHRocmVhZF90IHRocmVhZF9hcnJheVtNKk5dOwogICAgcHRocmVhZF90IHRocmVhZF9hcnJheVtNKk5dOyAvL21hbGxvYyhNKk4gKiBzaXplb2YocHRocmVhZF90KSk7CgogICAgcHRocmVhZF9hdHRyX3QgYXR0cjsKICAgIHB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKICAgZm9yKGkgPSAwOyBpIDwgTTsgaSsrKSB7CiAgICAgIGZvcihqID0gMDsgaiA8IE47IGorKykgewogICAgICAgICAvL0Fzc2lnbiBhIHJvdyBhbmQgY29sdW1uIGZvciBlYWNoIHRocmVhZAogICAgICAgICBzdHJ1Y3QgdiAqZGF0YSA9IChzdHJ1Y3QgdiAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCB2KSk7CiAgICAgICAgIGRhdGEtPmkgPSBpOwogICAgICAgICBkYXRhLT5qID0gajsKICAgICAgICAgLyogTm93IGNyZWF0ZSB0aGUgdGhyZWFkIHBhc3NpbmcgaXQgZGF0YSBhcyBhIHBhcmFtZXRlciAqLwogICAgICAgICAvL3B0aHJlYWRfdCB0aWQ7ICAgICAgIC8vVGhyZWFkIElECiAgICAgICAgIC8vcHRocmVhZF9hdHRyX3QgYXR0cjsgLy9TZXQgb2YgdGhyZWFkIGF0dHJpYnV0ZXMKICAgICAgICAgLy9HZXQgdGhlIGRlZmF1bHQgYXR0cmlidXRlcwogICAgICAgICAvL3B0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKICAgICAgICAgLy9DcmVhdGUgdGhlIHRocmVhZAoKICAgICAgICAgcHRocmVhZF9jcmVhdGUoJnRocmVhZF9hcnJheVtjb3VudF0sJmF0dHIscnVubmVyLGRhdGEpOwogICAgICAgICAvL01ha2Ugc3VyZSB0aGUgcGFyZW50IHdhaXRzIGZvciBhbGwgdGhyZWFkIHRvIGNvbXBsZXRlCiAgICAgICAgIC8vcHRocmVhZF9qb2luKHRpZCwgTlVMTCk7CiAgICAgICAgIGNvdW50Kys7CiAgICAgIH0KICAgfQogICBmb3IoaW50IGsgPTA7azxNKk47aysrKXsKICAgcHRocmVhZF9qb2luKHRocmVhZF9hcnJheVtrXSxOVUxMKTsKICAgfQogICAgIGNsb2NrX3QgZW5kID0gY2xvY2soKTsKICAgICBwcmludGYoIiVmXG4iLChmbG9hdCkoZW5kLXN0YXJ0KS9DTE9DS1NfUEVSX1NFQyApOwogIAogICAvL1ByaW50IG91dCB0aGUgcmVzdWx0aW5nIG1hdHJpeAogICAvL2ZvcihpID0gMDsgaSA8IE07IGkrKykgewogICAvLyAgIGZvcihqID0gMDsgaiA8IE47IGorKykgewogICAvLyAgICAgIHByaW50ZigiJWQgIiwgQ1tpXVtqXSk7CiAgIC8vICAgfQogICAvLyAgIHByaW50ZigiXG4iKTsKICAvLyB9Cn0KCi8vVGhlIHRocmVhZCB3aWxsIGJlZ2luIGNvbnRyb2wgaW4gdGhpcyBmdW5jdGlvbgp2b2lkICpydW5uZXIodm9pZCAqcGFyYW0pIHsKICAgc3RydWN0IHYgKmRhdGEgPSBwYXJhbTsgLy8gdGhlIHN0cnVjdHVyZSB0aGF0IGhvbGRzIG91ciBkYXRhCiAgIGludCBuLCBzdW0gPSAwOyAvL3RoZSBjb3VudGVyIGFuZCBzdW0KCiAgIC8vUm93IG11bHRpcGxpZWQgYnkgY29sdW1uCiAgIGZvcihuID0gMDsgbjwgSzsgbisrKXsKICAgICAgc3VtICs9IEFbZGF0YS0+aV1bbl0gKiBCW25dW2RhdGEtPmpdOwogICB9CiAgIC8vYXNzaWduIHRoZSBzdW0gdG8gaXRzIGNvb3JkaW5hdGUKICAgQ1tkYXRhLT5pXVtkYXRhLT5qXSA9IHN1bTsKCiAgIC8vRXhpdCB0aGUgdGhyZWFkCiAgIHB0aHJlYWRfZXhpdCgwKTsKfQ==