bw_mem.c 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. /*
  2. * bw_mem_wr.c - simple memory write bandwidth benchmark
  3. *
  4. * Usage: bw_mem_wr size
  5. *
  6. * This benchmark is directly comparable to the bw_mem_rd benchmark because
  7. * both do a load/store and an add per word.
  8. *
  9. * Copyright (c) 1994-1996 Larry McVoy. Distributed under the FSF GPL with
  10. * additional restriction that results may published only if
  11. * (1) the benchmark is unmodified, and
  12. * (2) the version in the sccsid below is included in the report.
  13. * Support for this development by Sun Microsystems is gratefully acknowledged.
  14. */
  15. char *id = "$Id$";
  16. #include "bench.h"
  17. #define TYPE int
  18. /*
  19. * rd - 4 byte read, 32 byte stride
  20. * wr - 4 byte write, 32 byte stride
  21. * rdwr - 4 byte read followed by 4 byte write to same place, 32 byte stride
  22. * cp - 4 byte read then 4 byte write to different place, 32 byte stride
  23. * fwr - write every 4 byte word
  24. * frd - read every 4 byte word
  25. * fcp - copy every 4 byte word
  26. *
  27. * All tests do 512 byte chunks in a loop.
  28. *
  29. * XXX - do a 64bit version of this.
  30. */
  31. void rd(TYPE *buf, TYPE *lastone);
  32. void wr(TYPE *buf, TYPE *lastone);
  33. void rdwr(TYPE *buf, TYPE *lastone);
  34. void cp(TYPE *buf, TYPE *dst, TYPE *lastone);
  35. void fwr(TYPE *buf, TYPE *lastone);
  36. void frd(TYPE *buf, TYPE *lastone);
  37. void fcp(TYPE *buf, TYPE *dst, TYPE *lastone);
  38. int
  39. main(ac, av)
  40. char **av;
  41. {
  42. size_t nbytes;
  43. TYPE *buf = 0, *buf2 = 0, *lastone;
  44. if (ac < 3) {
  45. usage: fprintf(stderr, "Usage: %s size what [conflict]\n", av[0]);
  46. fprintf(stderr,
  47. "what: rd wr rdwr cp fwr frd fcp bzero bcopy\n");
  48. exit(1);
  49. }
  50. nbytes = bytes(av[1]);
  51. if (nbytes < 512) { /* this is the number of bytes in the loop */
  52. exit(1);
  53. }
  54. buf = (TYPE *)valloc(nbytes);
  55. lastone = (TYPE*)((char *)buf + nbytes - 512);
  56. if (!buf) {
  57. perror("malloc");
  58. exit(1);
  59. }
  60. if (streq(av[2], "cp") ||
  61. streq(av[2], "fcp") || streq(av[2], "bcopy")) {
  62. buf2 = (TYPE *)valloc(nbytes + 2048);
  63. if (!buf2) {
  64. perror("malloc");
  65. exit(1);
  66. }
  67. /* default is to have stuff unaligned wrt each other */
  68. /* XXX - this is not well tested or thought out */
  69. if (ac == 3) {
  70. char *tmp = (char *)buf2;
  71. tmp += 2048 - 128;
  72. buf2 = (TYPE *)tmp;
  73. }
  74. }
  75. bzero((void*)buf, nbytes);
  76. if (streq(av[2], "rd")) {
  77. BENCHO(rd(buf, lastone), rd(buf, 0), 0);
  78. } else if (streq(av[2], "wr")) {
  79. BENCHO(wr(buf, lastone), wr(buf, 0), 0);
  80. } else if (streq(av[2], "rdwr")) {
  81. BENCHO(rdwr(buf, lastone), rdwr(buf, 0), 0);
  82. } else if (streq(av[2], "cp")) {
  83. BENCHO(cp(buf, buf2, lastone), cp(buf, buf2, 0), 0);
  84. } else if (streq(av[2], "frd")) {
  85. BENCHO(frd(buf, lastone), frd(buf, 0), 0);
  86. } else if (streq(av[2], "fwr")) {
  87. BENCHO(fwr(buf, lastone), fwr(buf, 0), 0);
  88. } else if (streq(av[2], "fcp")) {
  89. BENCHO(fcp(buf, buf2, lastone), fcp(buf, buf2, 0), 0);
  90. } else if (streq(av[2], "bzero")) {
  91. BENCHO(bzero((void*)buf, nbytes), bzero((void*)buf, 1), 0);
  92. } else if (streq(av[2], "bcopy")) {
  93. /* XXX - if gcc inlines this the numbers could be off */
  94. /* But they are off in a good way - the bcopy will appear
  95. * to cost around 0...
  96. */
  97. BENCHO(bcopy((void*)buf, (void*)buf2, nbytes), bcopy((void*)buf, (void*)buf2, 1), 0);
  98. } else {
  99. goto usage;
  100. }
  101. bandwidth(nbytes, get_n(), 0);
  102. return(0);
  103. }
  104. void
  105. rd(register TYPE *p, register TYPE *lastone)
  106. {
  107. register int sum = 0;
  108. while (p <= lastone) {
  109. sum +=
  110. #define DOIT(i) p[i]+
  111. DOIT(0) DOIT(4) DOIT(8) DOIT(12) DOIT(16) DOIT(20) DOIT(24)
  112. DOIT(28) DOIT(32) DOIT(36) DOIT(40) DOIT(44) DOIT(48) DOIT(52)
  113. DOIT(56) DOIT(60) DOIT(64) DOIT(68) DOIT(72) DOIT(76)
  114. DOIT(80) DOIT(84) DOIT(88) DOIT(92) DOIT(96) DOIT(100)
  115. DOIT(104) DOIT(108) DOIT(112) DOIT(116) DOIT(120)
  116. p[124];
  117. p += 128;
  118. }
  119. use_int(sum);
  120. }
  121. #undef DOIT
  122. void
  123. wr(register TYPE *p, register TYPE *lastone)
  124. {
  125. while (p <= lastone) {
  126. #define DOIT(i) p[i] = 1;
  127. DOIT(0) DOIT(4) DOIT(8) DOIT(12) DOIT(16) DOIT(20) DOIT(24)
  128. DOIT(28) DOIT(32) DOIT(36) DOIT(40) DOIT(44) DOIT(48) DOIT(52)
  129. DOIT(56) DOIT(60) DOIT(64) DOIT(68) DOIT(72) DOIT(76)
  130. DOIT(80) DOIT(84) DOIT(88) DOIT(92) DOIT(96) DOIT(100)
  131. DOIT(104) DOIT(108) DOIT(112) DOIT(116) DOIT(120) DOIT(124);
  132. p += 128;
  133. }
  134. use_pointer((void *)p);
  135. }
  136. #undef DOIT
  137. void
  138. rdwr(register TYPE *p, register TYPE *lastone)
  139. {
  140. register int sum = 0;
  141. while (p <= lastone) {
  142. #define DOIT(i) sum += p[i]; p[i] = 1;
  143. DOIT(0) DOIT(4) DOIT(8) DOIT(12) DOIT(16) DOIT(20) DOIT(24)
  144. DOIT(28) DOIT(32) DOIT(36) DOIT(40) DOIT(44) DOIT(48) DOIT(52)
  145. DOIT(56) DOIT(60) DOIT(64) DOIT(68) DOIT(72) DOIT(76)
  146. DOIT(80) DOIT(84) DOIT(88) DOIT(92) DOIT(96) DOIT(100)
  147. DOIT(104) DOIT(108) DOIT(112) DOIT(116) DOIT(120) DOIT(124);
  148. p += 128;
  149. }
  150. use_int(sum);
  151. }
  152. #undef DOIT
  153. void
  154. cp(register TYPE *p, register TYPE *dst, register TYPE *lastone)
  155. {
  156. while (p <= lastone) {
  157. #define DOIT(i) dst[i] = p[i];
  158. DOIT(0) DOIT(4) DOIT(8) DOIT(12) DOIT(16) DOIT(20) DOIT(24)
  159. DOIT(28) DOIT(32) DOIT(36) DOIT(40) DOIT(44) DOIT(48) DOIT(52)
  160. DOIT(56) DOIT(60) DOIT(64) DOIT(68) DOIT(72) DOIT(76)
  161. DOIT(80) DOIT(84) DOIT(88) DOIT(92) DOIT(96) DOIT(100)
  162. DOIT(104) DOIT(108) DOIT(112) DOIT(116) DOIT(120) DOIT(124);
  163. p += 128;
  164. dst += 128;
  165. }
  166. use_pointer((void*)p);
  167. }
  168. #undef DOIT
  169. void
  170. fwr(register TYPE *p, register TYPE *lastone)
  171. {
  172. while (p <= lastone) {
  173. #define DOIT(i) p[i]=
  174. DOIT(0) DOIT(1) DOIT(2) DOIT(3) DOIT(4) DOIT(5) DOIT(6)
  175. DOIT(7) DOIT(8) DOIT(9) DOIT(10) DOIT(11) DOIT(12)
  176. DOIT(13) DOIT(14) DOIT(15) DOIT(16) DOIT(17) DOIT(18)
  177. DOIT(19) DOIT(20) DOIT(21) DOIT(22) DOIT(23) DOIT(24)
  178. DOIT(25) DOIT(26) DOIT(27) DOIT(28) DOIT(29) DOIT(30)
  179. DOIT(31) DOIT(32) DOIT(33) DOIT(34) DOIT(35) DOIT(36)
  180. DOIT(37) DOIT(38) DOIT(39) DOIT(40) DOIT(41) DOIT(42)
  181. DOIT(43) DOIT(44) DOIT(45) DOIT(46) DOIT(47) DOIT(48)
  182. DOIT(49) DOIT(50) DOIT(51) DOIT(52) DOIT(53) DOIT(54)
  183. DOIT(55) DOIT(56) DOIT(57) DOIT(58) DOIT(59) DOIT(60)
  184. DOIT(61) DOIT(62) DOIT(63) DOIT(64) DOIT(65) DOIT(66)
  185. DOIT(67) DOIT(68) DOIT(69) DOIT(70) DOIT(71) DOIT(72)
  186. DOIT(73) DOIT(74) DOIT(75) DOIT(76) DOIT(77) DOIT(78)
  187. DOIT(79) DOIT(80) DOIT(81) DOIT(82) DOIT(83) DOIT(84)
  188. DOIT(85) DOIT(86) DOIT(87) DOIT(88) DOIT(89) DOIT(90)
  189. DOIT(91) DOIT(92) DOIT(93) DOIT(94) DOIT(95) DOIT(96)
  190. DOIT(97) DOIT(98) DOIT(99) DOIT(100) DOIT(101) DOIT(102)
  191. DOIT(103) DOIT(104) DOIT(105) DOIT(106) DOIT(107)
  192. DOIT(108) DOIT(109) DOIT(110) DOIT(111) DOIT(112)
  193. DOIT(113) DOIT(114) DOIT(115) DOIT(116) DOIT(117)
  194. DOIT(118) DOIT(119) DOIT(120) DOIT(121) DOIT(122)
  195. DOIT(123) DOIT(124) DOIT(125) DOIT(126) DOIT(127) 1;
  196. p += 128;
  197. }
  198. use_pointer((void*)p);
  199. }
  200. #undef DOIT
  201. void
  202. frd(register TYPE *p, register TYPE *lastone)
  203. {
  204. register int sum = 0;
  205. while (p <= lastone) {
  206. sum +=
  207. #define DOIT(i) p[i]+
  208. DOIT(0) DOIT(1) DOIT(2) DOIT(3) DOIT(4) DOIT(5) DOIT(6)
  209. DOIT(7) DOIT(8) DOIT(9) DOIT(10) DOIT(11) DOIT(12)
  210. DOIT(13) DOIT(14) DOIT(15) DOIT(16) DOIT(17) DOIT(18)
  211. DOIT(19) DOIT(20) DOIT(21) DOIT(22) DOIT(23) DOIT(24)
  212. DOIT(25) DOIT(26) DOIT(27) DOIT(28) DOIT(29) DOIT(30)
  213. DOIT(31) DOIT(32) DOIT(33) DOIT(34) DOIT(35) DOIT(36)
  214. DOIT(37) DOIT(38) DOIT(39) DOIT(40) DOIT(41) DOIT(42)
  215. DOIT(43) DOIT(44) DOIT(45) DOIT(46) DOIT(47) DOIT(48)
  216. DOIT(49) DOIT(50) DOIT(51) DOIT(52) DOIT(53) DOIT(54)
  217. DOIT(55) DOIT(56) DOIT(57) DOIT(58) DOIT(59) DOIT(60)
  218. DOIT(61) DOIT(62) DOIT(63) DOIT(64) DOIT(65) DOIT(66)
  219. DOIT(67) DOIT(68) DOIT(69) DOIT(70) DOIT(71) DOIT(72)
  220. DOIT(73) DOIT(74) DOIT(75) DOIT(76) DOIT(77) DOIT(78)
  221. DOIT(79) DOIT(80) DOIT(81) DOIT(82) DOIT(83) DOIT(84)
  222. DOIT(85) DOIT(86) DOIT(87) DOIT(88) DOIT(89) DOIT(90)
  223. DOIT(91) DOIT(92) DOIT(93) DOIT(94) DOIT(95) DOIT(96)
  224. DOIT(97) DOIT(98) DOIT(99) DOIT(100) DOIT(101) DOIT(102)
  225. DOIT(103) DOIT(104) DOIT(105) DOIT(106) DOIT(107)
  226. DOIT(108) DOIT(109) DOIT(110) DOIT(111) DOIT(112)
  227. DOIT(113) DOIT(114) DOIT(115) DOIT(116) DOIT(117)
  228. DOIT(118) DOIT(119) DOIT(120) DOIT(121) DOIT(122)
  229. DOIT(123) DOIT(124) DOIT(125) DOIT(126) p[127];
  230. p += 128;
  231. }
  232. use_int(sum);
  233. }
  234. #undef DOIT
  235. void
  236. fcp(register TYPE *p, register TYPE *dst, register TYPE *lastone)
  237. {
  238. while (p <= lastone) {
  239. #define DOIT(i) dst[i]=p[i];
  240. DOIT(0) DOIT(1) DOIT(2) DOIT(3) DOIT(4) DOIT(5) DOIT(6)
  241. DOIT(7) DOIT(8) DOIT(9) DOIT(10) DOIT(11) DOIT(12)
  242. DOIT(13) DOIT(14) DOIT(15) DOIT(16) DOIT(17) DOIT(18)
  243. DOIT(19) DOIT(20) DOIT(21) DOIT(22) DOIT(23) DOIT(24)
  244. DOIT(25) DOIT(26) DOIT(27) DOIT(28) DOIT(29) DOIT(30)
  245. DOIT(31) DOIT(32) DOIT(33) DOIT(34) DOIT(35) DOIT(36)
  246. DOIT(37) DOIT(38) DOIT(39) DOIT(40) DOIT(41) DOIT(42)
  247. DOIT(43) DOIT(44) DOIT(45) DOIT(46) DOIT(47) DOIT(48)
  248. DOIT(49) DOIT(50) DOIT(51) DOIT(52) DOIT(53) DOIT(54)
  249. DOIT(55) DOIT(56) DOIT(57) DOIT(58) DOIT(59) DOIT(60)
  250. DOIT(61) DOIT(62) DOIT(63) DOIT(64) DOIT(65) DOIT(66)
  251. DOIT(67) DOIT(68) DOIT(69) DOIT(70) DOIT(71) DOIT(72)
  252. DOIT(73) DOIT(74) DOIT(75) DOIT(76) DOIT(77) DOIT(78)
  253. DOIT(79) DOIT(80) DOIT(81) DOIT(82) DOIT(83) DOIT(84)
  254. DOIT(85) DOIT(86) DOIT(87) DOIT(88) DOIT(89) DOIT(90)
  255. DOIT(91) DOIT(92) DOIT(93) DOIT(94) DOIT(95) DOIT(96)
  256. DOIT(97) DOIT(98) DOIT(99) DOIT(100) DOIT(101) DOIT(102)
  257. DOIT(103) DOIT(104) DOIT(105) DOIT(106) DOIT(107)
  258. DOIT(108) DOIT(109) DOIT(110) DOIT(111) DOIT(112)
  259. DOIT(113) DOIT(114) DOIT(115) DOIT(116) DOIT(117)
  260. DOIT(118) DOIT(119) DOIT(120) DOIT(121) DOIT(122)
  261. DOIT(123) DOIT(124) DOIT(125) DOIT(126) DOIT(127)
  262. p += 128;
  263. dst += 128;
  264. }
  265. use_pointer((void*)p);
  266. }