Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <pthread.h>
- typedef struct matrix_arg{
- int** a;
- int** b;
- long int** c;
- }matrix_arg;
- /*
- void multi(matrix_arg* matrix_data,int start,int end){
- int i,j,k;
- long int temp = 0;
- printf("multi start\n");
- for(i = start; i<end;i++){
- for(j = 0; j< 4000;j++){
- for(k=0;k<4000;k++){
- temp += matrix_data->a[i][k] * matrix_data->b[k][j];
- }
- matrix_data->c[i][j] = temp;
- temp = 0;
- }
- printf("%dth done\n",i);
- }
- }
- */
- void *first(void* arg){
- matrix_arg* matrix_data = (matrix_arg*) arg;
- int i,j,k;
- long int temp = 0;
- printf("th1 start\n");
- /*
- multi(matrix_data, 0,2000);
- */
- for(i = 0;i<2000;i++){
- for(j=0;j<4000;j++){
- for(k = 0;k<4000;k++){
- temp += matrix_data->a[i][k] * matrix_data->b[k][j];
- }
- matrix_data->c[i][j] = temp;
- temp = 0;
- }
- printf("%d done\n",i);
- }
- }
- void *second(void* arg){
- matrix_arg* matrix_data = (matrix_arg*) arg;
- int i,j,k;
- long int temp = 0;
- printf("th2 start\n");
- /*
- multi(matrix_data,2000,4000);
- */
- for(i = 2000;i<4000;i++){
- for(j=0;j<4000;j++){
- for(k = 0;k<4000;k++){
- temp += matrix_data->a[i][k] * matrix_data->b[k][j];
- }
- matrix_data->c[i][j] = temp;
- temp = 0;
- }
- printf("%d done\n",i);
- }
- }
- int main(int argc, char* argv[]){
- pthread_t th1,th2;
- matrix_arg matrix_data;
- int i,j;
- FILE* fp1;
- FILE* fp2;
- fp1 = fopen("matrix1.txt","r");
- fp2 = fopen("matrix2.txt","r");
- matrix_data.a = (int**)malloc(sizeof(int*)*4000);
- matrix_data.b = (int**)malloc(sizeof(int*)*4000);
- matrix_data.c = (long int**)malloc(sizeof(long int*)*4000);
- for(i = 0;i<4000;i++){
- matrix_data.a[i] = (int*)malloc(sizeof(int) *4000);
- matrix_data.b[i] = (int*)malloc(sizeof(int) *4000);
- matrix_data.c[i] = (long int*)malloc(sizeof(long int) *4000);
- }
- printf("input start\n");
- for(i = 0;i<4000;i++){
- for(j = 0;j<4000;j++){
- fscanf(fp1,"%d",&matrix_data.a[i][j]);
- fscanf(fp2,"%d",&matrix_data.b[i][j]);
- }
- }
- int tid1,tid2;
- int res1,res2;
- tid1 = pthread_create(&th1, NULL, first, (void *)&matrix_data);
- tid2 = pthread_create(&th2, NULL, second,(void *)&matrix_data);
- pthread_join(th1, (void **)&res1);
- pthread_join(th2, (void **)&res2);
- long long int temp = 0;
- for(i=0;i<4000;i++){
- for(j=0;j<4000;j++){
- temp += matrix_data.c[i][j];
- }
- }
- printf("%lld",temp);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement