Advertisement
Guest User

Untitled

a guest
Oct 20th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.38 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>
  4. #include <string.h>
  5.  
  6.  
  7. double **a;
  8. double **b;
  9. double **c1;
  10. double **c2;
  11. char* fileA;
  12. char* fileB;
  13. char* fileC1;
  14. char* fileC2;
  15.  
  16.  
  17. struct row{
  18. int rowNum;
  19. };
  20. struct element{
  21. int rowNum;
  22. int colNum;
  23. };
  24. struct dimensions{
  25. int r1,r2,c1,c2;
  26. }*idx;
  27.  
  28. void intialize(int argc,char **argv){
  29. if(argc == 1){
  30. fileA = (char*)malloc(6);
  31. fileB = (char*)malloc(6);
  32. fileC1 = (char*)malloc(7);
  33. fileC2 = (char*)malloc(7);
  34.  
  35. strcpy(fileA,"A.txt");
  36. strcpy(fileB,"B.txt");
  37. strcpy(fileC1,"C1.txt");
  38. strcpy(fileC2,"C2.txt");
  39. }else if(argc == 4){
  40. fileA = (char*)malloc(strlen(argv[1])+1);
  41. fileB = (char*)malloc(strlen(argv[2])+1);
  42. fileC1 = (char*)malloc(strlen(argv[3])+2);
  43. fileC2 = (char*)malloc(strlen(argv[3])+2);
  44.  
  45. strcpy(fileA,argv[1]);
  46. strcat(fileA,".txt");
  47.  
  48. strcpy(fileB,argv[2]);
  49. strcat(fileB,".txt");
  50.  
  51. strcpy(fileC1,argv[3]);
  52. strcat(fileC1,"1.txt");
  53.  
  54. strcpy(fileC2,argv[3]);
  55. strcat(fileC2,"2.txt");
  56. }else{
  57. printf("Error in the arguments");
  58. exit(0);
  59. }
  60. }
  61.  
  62. void readMatrix(char *fileName,int isFirst,int *r ,int *c){
  63. FILE* f = fopen(fileName,"r");
  64. char buffer[255];
  65. fgets(buffer,255,f);
  66. char *ptr = strchr(buffer,'=');
  67. if(ptr == NULL){
  68. printf("Error in matrix dimension");
  69. exit(0);
  70. }
  71. ptr++;
  72. int val = 0;
  73. while(*ptr <= '9' && *ptr >= '0'){
  74. val *= 10;
  75. val += ((*ptr) - '0');
  76. ptr++;
  77. }
  78. *r = val;
  79. val = 0;
  80. ptr = strchr(ptr,'=');
  81. if(ptr == NULL){
  82. printf("Error in matrix dimension");
  83. exit(0);
  84. }
  85. ptr++;
  86. val = 0;
  87. while(*ptr <= '9' && *ptr >= '0'){
  88. val *= 10;
  89. val += ((*ptr) - '0');
  90. ptr++;
  91. }
  92. *c = val;
  93. int i,j;
  94. if(isFirst){
  95. a = (double**)malloc((*r) * sizeof(double*));
  96.  
  97. for(i = 0 ; i < (*r) ; i++){
  98. a[i] = (double*)malloc((*c) * sizeof(double));
  99. }
  100. }else{
  101. b = (double**)malloc((*r) * sizeof(double*));
  102. for( i = 0 ; i < (*r) ; i++){
  103. b[i] = (double*)malloc((*c) * sizeof(double));
  104. }
  105. }
  106. for( i = 0 ; i < (*r) ; i++){
  107. for( j = 0 ; j < (*c) ; j++){
  108. fscanf(f,"%s",buffer);
  109. if(isFirst){
  110. a[i][j] = atof(buffer);
  111. }else{
  112. b[i][j] = atof(buffer);
  113. }
  114.  
  115. }
  116. }
  117. fclose(f);
  118. return ;
  119. }
  120.  
  121.  
  122. void* rowRunnable(void* arg){
  123. struct row *parameter= (struct row *)arg;
  124. int i,j;
  125. for(i = 0 ; i < idx->c2; i++){//various columns
  126. double sum = 0;
  127. for(j = 0 ; j < idx->c1 ; j++){
  128. sum += a[parameter->rowNum][j] * b[j][i];
  129. }
  130. c1[parameter->rowNum][i] = sum;
  131. }
  132. pthread_exit(NULL);
  133. }
  134.  
  135. void *elementRunnable(void *arg){
  136. struct element *parameter = (struct element*)arg;
  137. double sum = 0;
  138. int i;
  139. for(i = 0 ; i < idx->c1;i++){
  140. sum += a[parameter->rowNum][i] * b[i][parameter->colNum];
  141. }
  142. c2[parameter->rowNum][parameter->colNum] = sum;
  143. pthread_exit(NULL);
  144. }
  145.  
  146. void writeMatrix(char* fileName,int first){
  147. FILE *f;
  148. f = fopen(fileName,"w");
  149.  
  150. int i,j;
  151. for(i = 0 ; i < idx->r1 ; i++){
  152. for(j = 0 ; j < idx->c2 ; j++){
  153. char cast[512];
  154. if(first){
  155. sprintf(cast,"%f",c1[i][j]);
  156. fputs(cast,f);
  157. fputs(" ",f);
  158. }else{
  159. sprintf(cast,"%f",c2[i][j]);
  160. fputs(cast,f);
  161. fputs(" ",f);
  162. }
  163. }
  164. fputs("\n",f);
  165. }
  166. fclose(f);
  167. return ;
  168. }
  169. int main(int arc ,char **argv)
  170. {
  171. intialize(arc,argv);
  172. int i,j,r_1,r_2,c_1,c_2;
  173. readMatrix(fileA,1,&r_1,&c_1);
  174. readMatrix(fileB,0,&r_2,&c_2);
  175. if(r_1 <= 0 || r_2 <= 0 || c_1 <= 0 || c_2 <= 0 || c_1 != r_2){
  176. printf("Error in the matrix dimensions");
  177. exit(0);
  178. }
  179. struct dimensions temp;
  180. temp.r1 = r_1;
  181. temp.c1 = c_1;
  182. temp.r2 = r_2;
  183. temp.c2 = c_2;
  184. idx = &temp;
  185. c1 = (double**)malloc(r_1 * sizeof(double*));
  186. c2 = (double**)malloc(r_1 * sizeof(double*));
  187. for(i = 0 ; i < r_1 ; i++){
  188. c1[i] = (double*)malloc(c_2*sizeof(double));
  189. c2[i] = (double*)malloc(c_2*sizeof(double));
  190. }
  191. //make row processing
  192. for(i = 0 ; i < idx->r1 ; i++){
  193. pthread_attr_t attr;
  194. pthread_attr_init(&attr);
  195. struct row info;
  196. info.rowNum = i;
  197. pthread_t tid;
  198. pthread_create(&tid, &attr, rowRunnable, &info);
  199. pthread_join(tid, NULL);
  200. }
  201. //make element processing
  202. for(i = 0 ; i < idx->r1 ; i++){
  203. for(j = 0 ; j < idx->c2 ; j++){
  204. pthread_attr_t attr;
  205. pthread_attr_init(&attr);
  206. struct element info;
  207. info.rowNum = i;
  208. info.colNum = j;
  209. pthread_t tid;
  210. pthread_create(&tid, &attr, elementRunnable, &info);
  211. pthread_join(tid,NULL);
  212. }
  213. }
  214. writeMatrix(fileC1,1);
  215. writeMatrix(fileC2,0);
  216. free(a);
  217. free(b);
  218. free(c1);
  219. free(c2);
  220. free(fileA);
  221. free(fileB);
  222. free(fileC1);
  223. free(fileC2);
  224. return 0;
  225. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement