Advertisement
nirn

Untitled

Apr 24th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.70 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <stdlib.h>
  4.  
  5.  
  6.  
  7.  
  8. #define sizeTable 2048
  9. #define repeatNumber 100
  10.  
  11. //
  12. clock_t startTime = 0;
  13. clock_t start = 0;
  14. clock_t end = 0;
  15.  
  16. struct vector
  17. {
  18. float a;
  19. float b;
  20. float c;
  21. float d;
  22. };
  23.  
  24.  
  25. struct vector a[sizeTable];
  26. struct vector b[sizeTable];
  27. struct vector sum[sizeTable];
  28. struct vector sub[sizeTable];
  29. struct vector mul[sizeTable];
  30. struct vector div_res[sizeTable];
  31.  
  32.  
  33. //SIMD------------------
  34.  
  35. void sum_simd(struct vector a, struct vector b, struct vector * wynik){
  36.  
  37. asm(
  38. "movaps %1, %%xmm0\n\t"
  39. "movaps %2, %%xmm1\n\t"
  40. "addps %%xmm1, %%xmm0\n\t"
  41. "movaps %%xmm0, %0\n\t"
  42. : "=m" (*wynik)
  43. : "m" (a),"m" (b)
  44. );
  45.  
  46. }
  47.  
  48. void sub_simd(struct vector a, struct vector b, struct vector * wynik){
  49. asm(
  50. "movaps %1, %%xmm0\n\t"
  51. "movaps %2, %%xmm1\n\t"
  52. "subps %%xmm1, %%xmm0\n\t"
  53. "movaps %%xmm0, %0\n\t"
  54. : "=m" (*wynik)
  55. : "m" (a),"m" (b)
  56. );
  57. }
  58.  
  59.  
  60.  
  61. void div_simd(struct vector a, struct vector b, struct vector * wynik){
  62. asm(
  63. "movaps %1, %%xmm0\n\t"
  64. "movaps %2, %%xmm1\n\t"
  65. "divps %%xmm1, %%xmm0\n\t"
  66. "movaps %%xmm0, %0\n\t"
  67. : "=m" (*wynik)
  68. : "m" (a),"m" (b)
  69. );
  70. }
  71.  
  72. void mul_simd(struct vector a, struct vector b, struct vector * wynik){
  73. asm(
  74. "movaps %1, %%xmm0\n\t"
  75. "movaps %2, %%xmm1\n\t"
  76. "mulps %%xmm1, %%xmm0\n\t"
  77. "movaps %%xmm0, %0\n\t"
  78. : "=m" (*wynik)
  79. : "m" (a),"m" (b)
  80. );
  81. }
  82.  
  83.  
  84.  
  85. //SISD-------------------------------------------------
  86.  
  87. void sum_sisd(struct vector a, struct vector b, struct vector * wynik){
  88.  
  89. asm(
  90. "fld %4\n\t" //wrzuc a.a na stos FPU
  91. "fadd %8\n\t" //dodaj b.a do st0
  92. "fstp %0\n\t" //przenies st0 do wynik->1
  93.  
  94. "fld %5\n\t"
  95. "fadd %9\n\t"
  96. "fstp %1\n\t"
  97.  
  98. "fld %6\n\t"
  99. "fadd %10\n\t"
  100. "fstp %2\n\t"
  101.  
  102. "fld %7\n\t"
  103. "fadd %11\n\t"
  104. "fstp %3\n\t"
  105.  
  106. : "=m" (wynik->a), //0
  107. "=m" (wynik->b), //1
  108. "=m" (wynik->c), //2
  109. "=m" (wynik->d) //3
  110. : "m" (a.a), //4
  111. "m" (a.b), //5
  112. "m" (a.c), //6
  113. "m" (a.d), //7
  114. "m" (b.a), //8
  115. "m" (b.b), //9
  116. "m" (b.c), //10
  117. "m" (b.d) //11
  118. );
  119.  
  120. }
  121. void sub_sisd(struct vector a, struct vector b, struct vector * wynik){
  122.  
  123. asm(
  124. "fld %4\n\t"
  125. "fsub %8 \n\t"
  126. "fstp %0\n\t"
  127.  
  128. "fld %5\n\t"
  129. "fsub %9\n\t"
  130. "fstp %1\n\t"
  131.  
  132. "fld %6\n\t"
  133. "fsub %10\n\t"
  134. "fstp %2\n\t"
  135.  
  136. "fld %7\n\t"
  137. "fsub %11\n\t"
  138. "fstp %3\n\t"
  139.  
  140. : "=m" (wynik->a), //0
  141. "=m" (wynik->b), //1
  142. "=m" (wynik->c), //2
  143. "=m" (wynik->d) //3
  144. : "m" (a.a), //4
  145. "m" (a.b), //5
  146. "m" (a.c), //6
  147. "m" (a.d), //7
  148. "m" (b.a), //8
  149. "m" (b.b), //9
  150. "m" (b.c), //10
  151. "m" (b.d) //11
  152. );
  153.  
  154. }
  155. void mul_sisd(struct vector a, struct vector b, struct vector * wynik){
  156.  
  157. asm(
  158. "fld %4\n\t"
  159. "fmul %8 \n\t"
  160. "fstp %0\n\t"
  161.  
  162. "fld %5\n\t"
  163. "fmul %9\n\t"
  164. "fstp %1\n\t"
  165.  
  166. "fld %6\n\t"
  167. "fmul %10\n\t"
  168. "fstp %2\n\t"
  169.  
  170. "fld %7\n\t"
  171. "fmul %11\n\t"
  172. "fstp %3\n\t"
  173.  
  174. : "=m" (wynik->a), //0
  175. "=m" (wynik->b), //1
  176. "=m" (wynik->c), //2
  177. "=m" (wynik->d) //3
  178. : "m" (a.a), //4
  179. "m" (a.b), //5
  180. "m" (a.c), //6
  181. "m" (a.d), //7
  182. "m" (b.a), //8
  183. "m" (b.b), //9
  184. "m" (b.c), //10
  185. "m" (b.d) //11
  186. );
  187.  
  188. }
  189.  
  190. void div_sisd(struct vector a, struct vector b, struct vector * wynik){
  191.  
  192. asm(
  193. "fld %4\n\t"
  194. "fdiv %8 \n\t"
  195. "fstp %0\n\t"
  196.  
  197. "fld %5\n\t"
  198. "fdiv %9\n\t"
  199. "fstp %1\n\t"
  200.  
  201. "fld %6\n\t"
  202. "fdiv %10\n\t"
  203. "fstp %2\n\t"
  204.  
  205. "fld %7\n\t"
  206. "fdiv %11\n\t"
  207. "fstp %3\n\t"
  208.  
  209. : "=m" (wynik->a), //0
  210. "=m" (wynik->b), //1
  211. "=m" (wynik->c), //2
  212. "=m" (wynik->d) //3
  213. : "m" (a.a), //4
  214. "m" (a.b), //5
  215. "m" (a.c), //6
  216. "m" (a.d), //7
  217. "m" (b.a), //8
  218. "m" (b.b), //9
  219. "m" (b.c), //10
  220. "m" (b.d) //11
  221. );
  222.  
  223. }
  224.  
  225. void SISD(){
  226. double timeSum = 0,timeSub = 0,timeMul = 0,timeDiv = 0;
  227. int j, i;
  228. //usrednianie wyniku----------
  229. for(j = 0;j<repeatNumber;j++){
  230.  
  231. //dodawanie-----------
  232. for(i = 0;i<sizeTable;i++){
  233. startTime = clock();
  234. sum_sisd(a[i],b[i],&sum[i]);
  235. timeSum += ((double)clock() - startTime)/CLOCKS_PER_SEC*1000.0;
  236. }
  237.  
  238. //odjemowanie---------
  239. for( i = 0;i<sizeTable;i++){
  240. startTime = clock();
  241. sub_sisd(a[i],b[i],&sub[i]);
  242. timeSub += ((double)clock() - startTime)/CLOCKS_PER_SEC*1000.0;
  243. }
  244.  
  245. //mnozenie-------------
  246. for(i = 0;i<sizeTable;i++){
  247. startTime = clock();
  248. mul_sisd(a[i],b[i],&mul[i]);
  249. timeMul += ((double)clock() - startTime)/CLOCKS_PER_SEC*1000.0;
  250. }
  251. //dzielnie------------
  252.  
  253. for(i = 0;i<sizeTable;i++){
  254. startTime = clock();
  255. div_sisd(a[i],b[i],&div_res[i]);
  256. timeDiv += ((double)clock() - startTime)/CLOCKS_PER_SEC*1000.0;
  257. }
  258.  
  259. }
  260.  
  261. timeSum = timeSum/(float)(repeatNumber*sizeTable);
  262. timeDiv = timeDiv/(float)(repeatNumber*sizeTable);
  263. timeMul = timeMul/(float)(repeatNumber*sizeTable);
  264. timeSub = timeSub/(float)(repeatNumber*sizeTable);
  265.  
  266. printf("Liczba liczb: %d\nSredni czas [ms]: \n+ %lf \n- %lf \n* %lf \n/ %lf \n",(4*sizeTable),timeSum,timeSub,timeMul,timeDiv);
  267. }
  268.  
  269. //generator-------------------------------------------------
  270. void randomGenerator()
  271. {
  272. int i=0;
  273. for ( i; i < sizeTable;i++){
  274. a[i].a = (float)(rand()%1000000)/100.0f;
  275. a[i].b = (float)(rand()%1000000)/100.0f;
  276. a[i].c = (float)(rand()%1000000)/100.0f;
  277. a[i].d = (float)(rand()%1000000)/100.0f;
  278. b[i].a = (float)(rand()%1000000)/100.0f;
  279. b[i].b = (float)(rand()%1000000)/100.0f;
  280. b[i].c = (float)(rand()%1000000)/100.0f;
  281. b[i].d = (float)(rand()%1000000)/100.0f;
  282. }
  283. }
  284.  
  285.  
  286. //SIMD_cout---------------------------------------------------
  287. void SIMD_test(){
  288.  
  289. double timeSum = 0,timeSub = 0,timeMul = 0,timeDiv = 0;
  290. int j, i;
  291. for (j = 0;j<repeatNumber;j++){
  292. //dodawanie
  293.  
  294. for (i = 0;i<sizeTable;i++){
  295. start=clock();
  296. sum_simd(a[i],b[i],&sum[i]);
  297. end=clock();
  298. timeSum+= ((double) (end - start)) / CLOCKS_PER_SEC*1000.0;
  299. }
  300.  
  301. //odejmowanie
  302.  
  303. for (i = 0;i<sizeTable;i++){
  304. start=clock();
  305. sub_simd(a[i],b[i],&sub[i]);
  306.  
  307. timeSub+= ((double)clock() - start)/CLOCKS_PER_SEC*1000.0;
  308. }
  309.  
  310.  
  311. //mnozenie
  312.  
  313. for (i = 0;i<sizeTable;i++){
  314. start=clock();
  315. mul_simd(a[i],b[i],&mul[i]);
  316. end=clock();
  317. timeMul+= ((double) (end - start)) / CLOCKS_PER_SEC*1000.0;
  318. }
  319.  
  320. //dzielenie
  321.  
  322. for (i = 0;i<sizeTable;i++){
  323. start=clock();
  324. div_simd(a[i],b[i],&div_res[i]);
  325. end=clock();
  326. timeDiv+= ((double) (end - start)) / CLOCKS_PER_SEC*1000.0;
  327. }
  328.  
  329. }
  330. timeSum=timeSum/(float)(repeatNumber);
  331. timeSub=timeSub/(float)(repeatNumber);
  332. timeMul=timeMul/(float)(repeatNumber);
  333. timeDiv=timeDiv/(float)(repeatNumber);
  334.  
  335. printf("Liczba liczb: %d\nSredni czas [ms]: \n+ %lf \n- %lf \n* %lf \n/ %lf \n",(4*sizeTable),timeSum,timeSub,timeMul,timeDiv);
  336. }
  337.  
  338. int main(void){
  339.  
  340. srand(time(NULL));
  341. randomGenerator();
  342.  
  343. printf("Typ obliczen: SIMD\n");
  344. SIMD_test();
  345. printf("Typ obliczen: SISD\n");
  346. SISD();
  347.  
  348.  
  349. return 0;
  350. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement