common.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. #include <string.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <time.h>
  5. #include <math.h>
  6. #include "common.h"
  7. void stopwatch_start(stopwatch *sw){
  8. if (sw == NULL)
  9. return;
  10. bzero(&sw->begin, sizeof(struct timeval));
  11. bzero(&sw->end , sizeof(struct timeval));
  12. gettimeofday(&sw->begin, NULL);
  13. }
  14. void stopwatch_stop(stopwatch *sw){
  15. if (sw == NULL)
  16. return;
  17. gettimeofday(&sw->end, NULL);
  18. }
  19. double
  20. get_interval_by_sec(stopwatch *sw){
  21. if (sw == NULL)
  22. return 0;
  23. return ((double)(sw->end.tv_sec-sw->begin.tv_sec)+(double)(sw->end.tv_usec-sw->begin.tv_usec)/1000000);
  24. }
  25. int
  26. get_interval_by_usec(stopwatch *sw){
  27. if (sw == NULL)
  28. return 0;
  29. return ((sw->end.tv_sec-sw->begin.tv_sec)*1000000+(sw->end.tv_usec-sw->begin.tv_usec));
  30. }
  31. func_ret_t
  32. create_matrix_from_file(float **mp, const char* filename, int *size_p){
  33. int i, j, size;
  34. float *m;
  35. FILE *fp = NULL;
  36. fp = fopen(filename, "rb");
  37. if ( fp == NULL) {
  38. return RET_FAILURE;
  39. }
  40. fscanf(fp, "%d\n", &size);
  41. m = (float*) malloc(sizeof(float)*size*size);
  42. if ( m == NULL) {
  43. fclose(fp);
  44. return RET_FAILURE;
  45. }
  46. for (i=0; i < size; i++) {
  47. for (j=0; j < size; j++) {
  48. fscanf(fp, "%f ", m+i*size+j);
  49. }
  50. }
  51. fclose(fp);
  52. *size_p = size;
  53. *mp = m;
  54. return RET_SUCCESS;
  55. }
  56. func_ret_t
  57. create_matrix_from_random(float **mp, int size){
  58. float *l, *u, *m;
  59. int i,j,k;
  60. srand(time(NULL));
  61. l = (float*)malloc(size*size*sizeof(float));
  62. if ( l == NULL)
  63. return RET_FAILURE;
  64. u = (float*)malloc(size*size*sizeof(float));
  65. if ( u == NULL) {
  66. free(l);
  67. return RET_FAILURE;
  68. }
  69. for (i = 0; i < size; i++) {
  70. for (j=0; j < size; j++) {
  71. if (i>j) {
  72. l[i*size+j] = GET_RAND_FP;
  73. } else if (i == j) {
  74. l[i*size+j] = 1;
  75. } else {
  76. l[i*size+j] = 0;
  77. }
  78. }
  79. }
  80. for (j=0; j < size; j++) {
  81. for (i=0; i < size; i++) {
  82. if (i>j) {
  83. u[j*size+i] = 0;
  84. }else {
  85. u[j*size+i] = GET_RAND_FP;
  86. }
  87. }
  88. }
  89. for (i=0; i < size; i++) {
  90. for (j=0; j < size; j++) {
  91. for (k=0; k <= MIN(i,j); k++)
  92. m[i*size+j] = l[i*size+k] * u[j*size+k];
  93. }
  94. }
  95. free(l);
  96. free(u);
  97. *mp = m;
  98. return RET_SUCCESS;
  99. }
  100. void
  101. matrix_multiply(float *inputa, float *inputb, float *output, int size){
  102. int i, j, k;
  103. for (i=0; i < size; i++)
  104. for (k=0; k < size; k++)
  105. for (j=0; j < size; j++)
  106. output[i*size+j] = inputa[i*size+k] * inputb[k*size+j];
  107. }
  108. func_ret_t
  109. lud_verify(float *m, float *lu, int matrix_dim){
  110. int i,j,k;
  111. float *tmp = (float*)malloc(matrix_dim*matrix_dim*sizeof(float));
  112. for (i=0; i < matrix_dim; i ++)
  113. for (j=0; j< matrix_dim; j++) {
  114. float sum = 0;
  115. float l,u;
  116. for (k=0; k <= MIN(i,j); k++){
  117. if ( i==k)
  118. l=1;
  119. else
  120. l=lu[i*matrix_dim+k];
  121. u=lu[k*matrix_dim+j];
  122. sum+=l*u;
  123. }
  124. tmp[i*matrix_dim+j] = sum;
  125. }
  126. /* printf(">>>>>LU<<<<<<<\n"); */
  127. /* for (i=0; i<matrix_dim; i++){ */
  128. /* for (j=0; j<matrix_dim;j++){ */
  129. /* printf("%f ", lu[i*matrix_dim+j]); */
  130. /* } */
  131. /* printf("\n"); */
  132. /* } */
  133. /* printf(">>>>>result<<<<<<<\n"); */
  134. /* for (i=0; i<matrix_dim; i++){ */
  135. /* for (j=0; j<matrix_dim;j++){ */
  136. /* printf("%f ", tmp[i*matrix_dim+j]); */
  137. /* } */
  138. /* printf("\n"); */
  139. /* } */
  140. /* printf(">>>>>input<<<<<<<\n"); */
  141. /* for (i=0; i<matrix_dim; i++){ */
  142. /* for (j=0; j<matrix_dim;j++){ */
  143. /* printf("%f ", m[i*matrix_dim+j]); */
  144. /* } */
  145. /* printf("\n"); */
  146. /* } */
  147. for (i=0; i<matrix_dim; i++){
  148. for (j=0; j<matrix_dim; j++){
  149. if ( fabs(m[i*matrix_dim+j]-tmp[i*matrix_dim+j]) > 0.0001)
  150. printf("dismatch at (%d, %d): (o)%f (n)%f\n", i, j, m[i*matrix_dim+j], tmp[i*matrix_dim+j]);
  151. }
  152. }
  153. free(tmp);
  154. }
  155. void
  156. matrix_duplicate(float *src, float **dst, int matrix_dim) {
  157. int s = matrix_dim*matrix_dim*sizeof(float);
  158. float *p = (float *) malloc (s);
  159. memcpy(p, src, s);
  160. *dst = p;
  161. }
  162. void
  163. print_matrix(float *m, int matrix_dim) {
  164. int i, j;
  165. for (i=0; i<matrix_dim;i++) {
  166. for (j=0; j<matrix_dim;j++)
  167. printf("%f ", m[i*matrix_dim+j]);
  168. printf("\n");
  169. }
  170. }
  171. // Generate well-conditioned matrix internally by Ke Wang 2013/08/07 22:20:06
  172. func_ret_t
  173. create_matrix(float **mp, int size){
  174. float *m;
  175. int i,j;
  176. float lamda = -0.001;
  177. float coe[2*size-1];
  178. float coe_i =0.0;
  179. for (i=0; i < size; i++)
  180. {
  181. coe_i = 10*exp(lamda*i);
  182. j=size-1+i;
  183. coe[j]=coe_i;
  184. j=size-1-i;
  185. coe[j]=coe_i;
  186. }
  187. m = (float*) malloc(sizeof(float)*size*size);
  188. if ( m == NULL) {
  189. return RET_FAILURE;
  190. }
  191. for (i=0; i < size; i++) {
  192. for (j=0; j < size; j++) {
  193. m[i*size+j]=coe[size-1-i+j];
  194. }
  195. }
  196. *mp = m;
  197. return RET_SUCCESS;
  198. }