Computer Organization and Design assignements
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

main.c 4.0 KiB

il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /*!
  2. \file main.c
  3. \brief Matrix multiplication implementation.
  4. \author Nikos Pitsianis
  5. \author Dimitris Floros
  6. \author Christos Choutouridis 8997 <cchoutou@ece.auth.gr>
  7. \date 2020-05-05
  8. */
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <math.h>
  13. #include <sys/time.h>
  14. #include <assert.h>
  15. #include "matmul.h"
  16. extern double sqrt (double);
  17. int cmpfunc (const void * a, const void * b) {
  18. double v =*(double*)a - *(double*)b;
  19. return (v < 0) ? -1 : (v > 0) ? 1 : 0;
  20. }
  21. double median (double* t, size_t n) {
  22. qsort ((void*)t, n, sizeof(t[0]), cmpfunc);
  23. return (n % 2) ? t[n/2] : (t[n/2] + t[n/2 -1]) /2;
  24. }
  25. double std_deviation (double* t, size_t n) {
  26. double av =0;
  27. for (size_t i=0 ; i<n ; ++i) {
  28. av += t[i];
  29. }
  30. av /= n;
  31. double s =0;
  32. for (size_t i=0 ; i<n ; ++i) {
  33. s += (t[i]-av)*(t[i]-av);
  34. }
  35. return sqrt (s/n);
  36. }
  37. mMult_ft multSelect (char* order) {
  38. if (! strcmp ((const char*)order, "ijk")) return matrixMult_ijk;
  39. else if (! strcmp ((const char*)order, "ikj")) return matrixMult_ikj;
  40. else if (! strcmp ((const char*)order, "jik")) return matrixMult_jik;
  41. else if (! strcmp ((const char*)order, "jki")) return matrixMult_jki;
  42. else if (! strcmp ((const char*)order, "kij")) return matrixMult_kij;
  43. else if (! strcmp ((const char*)order, "kji")) return matrixMult_kji;
  44. else return matrixMult_ijk;
  45. }
  46. mMultBlock_ft multBlockSelect (char* order) {
  47. if (! strcmp ((const char*)order, "ijk")) return matrixMult_ijk_block;
  48. else if (! strcmp ((const char*)order, "ikj")) return matrixMult_ikj_block;
  49. else if (! strcmp ((const char*)order, "jik")) return matrixMult_jik_block;
  50. else if (! strcmp ((const char*)order, "jki")) return matrixMult_jki_block;
  51. else if (! strcmp ((const char*)order, "kij")) return matrixMult_kij_block;
  52. else if (! strcmp ((const char*)order, "kji")) return matrixMult_kji_block;
  53. else return matrixMult_ijk_block;
  54. }
  55. /*!
  56. * A unit testing like main function to profile our code
  57. */
  58. int main(int argc, char **argv) {
  59. struct timeval start, end; /* time structs */
  60. double time[MAX_ITER] = {0.0}; /* execution time array in ms */
  61. float *A, *B, *C; /* matrix declarations */
  62. mMult_ft mMult =NULL;
  63. mMultBlock_ft mMultBlock =NULL;
  64. /* read matrix size (or use default) */
  65. if (argc < 3){
  66. fprintf( stderr,
  67. "Usage:\n"
  68. "%s n order [block], where \n"
  69. " n: is the matrix size.\n"
  70. " order: the loop order ex: ijk , jik, ...\n"
  71. " block: Optional block size\n",
  72. argv[0]);
  73. exit(1);
  74. }
  75. int n = atoi( argv[1] );
  76. if (argc == 4)
  77. mMultBlock = multBlockSelect(argv[2]);
  78. else
  79. mMult = multSelect(argv[2]);
  80. /* initialize matrices */
  81. A = matrixInit( n );
  82. B = matrixInit( n );
  83. C = (float *) malloc( n*n*sizeof(float) );
  84. /* compute matrix multiplication */
  85. for (int it = 0; it < MAX_ITER; it++) {
  86. if (argc == 4) {
  87. gettimeofday(&start, NULL);
  88. mMultBlock( C, A, B, n, atoi(argv[3]) );
  89. gettimeofday(&end, NULL);
  90. }
  91. else {
  92. gettimeofday(&start, NULL);
  93. mMult( C, A, B, n );
  94. gettimeofday(&end, NULL);
  95. }
  96. time[it] = (end.tv_sec - start.tv_sec) * 1000.0 + /* sec to ms */
  97. (end.tv_usec - start.tv_usec) / 1000.0; /* us to ms */
  98. printf("Iter: %d Time: %f ms\n", it, time[it]);
  99. }
  100. /* we need to use the result -- verify it */
  101. for (int i = 0; i < n; i++) { /* rows */
  102. for (int j = 0; j < n; j++) { /* cols */
  103. float gold = 0;
  104. for (int k = 0; k < n; k++) { /* accumulate products */
  105. gold += A[ sub2ind(i,k,n) ] * B[ sub2ind(k,j,n) ];
  106. }
  107. assert( (gold - C[sub2ind(i,j,n)]) < 1e-3 );
  108. }
  109. }
  110. // statistical data
  111. printf ("Median: %f [msec]\n", median (time, MAX_ITER));
  112. printf ("Std.Dev: %f [msec]\n", std_deviation(time, MAX_ITER));
  113. }