test2DMatrixAddition.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. this.WScript.LoadScriptFile("..\\UnitTestFramework\\SimdJsHelpers.js");
  6. function asmModule(stdlib, imports, buffer) {
  7. "use asm";
  8. var log = stdlib.Math.log;
  9. var toF = stdlib.Math.fround;
  10. var imul = stdlib.Math.imul;
  11. var i4 = stdlib.SIMD.Int32x4;
  12. var i4store = i4.store;
  13. var i4swizzle = i4.swizzle;
  14. var i4check = i4.check;
  15. var f4 = stdlib.SIMD.Float32x4;
  16. var f4equal = f4.equal;
  17. var f4lessThan = f4.lessThan;
  18. var f4splat = f4.splat;
  19. var f4store = f4.store;
  20. var f4load = f4.load;
  21. var f4check = f4.check;
  22. var f4abs = f4.abs;
  23. var f4add = f4.add;
  24. var f4sub = f4.sub;
  25. var Float32Heap = new stdlib.Float32Array(buffer);
  26. var Int32Heap = new stdlib.Int32Array(buffer);
  27. var BLOCK_SIZE = 4;
  28. function matrixAddition(aIndex, bIndex, cIndex) {
  29. aIndex = aIndex | 0;
  30. bIndex = bIndex | 0;
  31. cIndex = cIndex | 0;
  32. var i = 0, dim1 = 0, dim2 = 0, matrixSize = 0;
  33. var aPiece = f4(0.0, 0.0, 0.0, 0.0), bPiece = f4(0.0, 0.0, 0.0, 0.0);
  34. dim1 = Int32Heap[aIndex << 2 >> 2] | 0;
  35. dim2 = Int32Heap[aIndex + 1 << 2 >> 2] | 0;
  36. matrixSize = imul(dim1, dim2);
  37. //array dimensions don't match
  38. if (((dim2 | 0) != (Int32Heap[bIndex + 1 << 2 >> 2] | 0)) | ((dim1 | 0) != (Int32Heap[bIndex << 2 >> 2] | 0))) {
  39. return -1;
  40. }
  41. Int32Heap[cIndex << 2 >> 2] = dim1;
  42. Int32Heap[cIndex + 1 << 2 >> 2] = dim2;
  43. while ((i|0) < (matrixSize|0)) {
  44. aPiece = f4load(Float32Heap, aIndex + 2 + i << 2 >> 2);
  45. bPiece = f4load(Float32Heap, bIndex + 2 + i << 2 >> 2);
  46. f4store(Float32Heap, cIndex + 2 + i << 2 >> 2, f4add(aPiece, bPiece));
  47. i = (i + BLOCK_SIZE)|0;
  48. }
  49. return 0;
  50. }
  51. function new2DMatrix(startIndex, dim1, dim2) {
  52. startIndex = startIndex | 0;
  53. dim1 = dim1 | 0;
  54. dim2 = dim2 | 0;
  55. var i = 0, matrixSize = 0;
  56. matrixSize = imul(dim1, dim2);
  57. Int32Heap[startIndex << 2 >> 2] = dim1;
  58. Int32Heap[startIndex + 1 << 2 >> 2] = dim2;
  59. for (i = 0; (i|0) < ((matrixSize - BLOCK_SIZE)|0); i = (i + BLOCK_SIZE)|0) {
  60. f4store(Float32Heap, startIndex + 2 + i << 2 >> 2, f4(toF((i + 1)|0), toF((i + 2)|0), toF((i + 3)|0), toF((i + 4)|0)));
  61. }
  62. for (; (i|0) < (matrixSize|0); i = (i + 1)|0) {
  63. Float32Heap[(startIndex + 2 + i) << 2 >> 2] = toF((i + 1)|0);
  64. }
  65. return (startIndex + 2 + i) | 0;
  66. }
  67. return {
  68. new2DMatrix: new2DMatrix,
  69. matrixAddition: matrixAddition
  70. };
  71. }
  72. ////////////////////////////////////////////////////////////////
  73. //Call GEN_BASELINE() to generate baseline data and initialize RESULTS with it.
  74. ///////////////////////////////////////////////////////////////
  75. function GEN_BASELINE(buffer, start) {
  76. var IntHeap32 = new Int32Array(buffer);
  77. var FloatHeap32 = new Float32Array(buffer);
  78. var f4;
  79. var dim1 = IntHeap32[start];
  80. var dim2 = IntHeap32[start + 1];
  81. WScript.Echo("[");
  82. for (var i = 0; i < Math.imul(dim1, dim2) ; i += 4) {
  83. f4 = SIMD.Float32x4.load(FloatHeap32, i + start + 2);
  84. WScript.Echo(f4.toString()+",");
  85. }
  86. WScript.Echo("]");
  87. }
  88. function verify2DMatrix(buffer, start, results) {
  89. var IntHeap32 = new Int32Array(buffer);
  90. var FloatHeap32 = new Float32Array(buffer);
  91. var f4;
  92. var dim1 = IntHeap32[start];
  93. var dim2 = IntHeap32[start + 1];
  94. for (var i = 0, rslt_idx = 0; i < Math.imul(dim1, dim2) ; i += 4) {
  95. f4 = SIMD.Float32x4.load(FloatHeap32, i + start + 2);
  96. equalSimd(results[rslt_idx++], f4, SIMD.Float32x4, "2d Matrix Addition");
  97. }
  98. }
  99. var buffer = new ArrayBuffer(16 * 1024 * 1024);
  100. var m = asmModule(this, null, buffer);
  101. WScript.Echo("2D Matrix Addition");
  102. m.new2DMatrix(0, 18, 12);
  103. m.new2DMatrix(500, 18, 12);
  104. m.matrixAddition(0, 500, 1000);
  105. // GEN_BASELINE(buffer, 1000);
  106. var RESULTS = [
  107. SIMD.Float32x4(2, 4, 6, 8),
  108. SIMD.Float32x4(10, 12, 14, 16),
  109. SIMD.Float32x4(18, 20, 22, 24),
  110. SIMD.Float32x4(26, 28, 30, 32),
  111. SIMD.Float32x4(34, 36, 38, 40),
  112. SIMD.Float32x4(42, 44, 46, 48),
  113. SIMD.Float32x4(50, 52, 54, 56),
  114. SIMD.Float32x4(58, 60, 62, 64),
  115. SIMD.Float32x4(66, 68, 70, 72),
  116. SIMD.Float32x4(74, 76, 78, 80),
  117. SIMD.Float32x4(82, 84, 86, 88),
  118. SIMD.Float32x4(90, 92, 94, 96),
  119. SIMD.Float32x4(98, 100, 102, 104),
  120. SIMD.Float32x4(106, 108, 110, 112),
  121. SIMD.Float32x4(114, 116, 118, 120),
  122. SIMD.Float32x4(122, 124, 126, 128),
  123. SIMD.Float32x4(130, 132, 134, 136),
  124. SIMD.Float32x4(138, 140, 142, 144),
  125. SIMD.Float32x4(146, 148, 150, 152),
  126. SIMD.Float32x4(154, 156, 158, 160),
  127. SIMD.Float32x4(162, 164, 166, 168),
  128. SIMD.Float32x4(170, 172, 174, 176),
  129. SIMD.Float32x4(178, 180, 182, 184),
  130. SIMD.Float32x4(186, 188, 190, 192),
  131. SIMD.Float32x4(194, 196, 198, 200),
  132. SIMD.Float32x4(202, 204, 206, 208),
  133. SIMD.Float32x4(210, 212, 214, 216),
  134. SIMD.Float32x4(218, 220, 222, 224),
  135. SIMD.Float32x4(226, 228, 230, 232),
  136. SIMD.Float32x4(234, 236, 238, 240),
  137. SIMD.Float32x4(242, 244, 246, 248),
  138. SIMD.Float32x4(250, 252, 254, 256),
  139. SIMD.Float32x4(258, 260, 262, 264),
  140. SIMD.Float32x4(266, 268, 270, 272),
  141. SIMD.Float32x4(274, 276, 278, 280),
  142. SIMD.Float32x4(282, 284, 286, 288),
  143. SIMD.Float32x4(290, 292, 294, 296),
  144. SIMD.Float32x4(298, 300, 302, 304),
  145. SIMD.Float32x4(306, 308, 310, 312),
  146. SIMD.Float32x4(314, 316, 318, 320),
  147. SIMD.Float32x4(322, 324, 326, 328),
  148. SIMD.Float32x4(330, 332, 334, 336),
  149. SIMD.Float32x4(338, 340, 342, 344),
  150. SIMD.Float32x4(346, 348, 350, 352),
  151. SIMD.Float32x4(354, 356, 358, 360),
  152. SIMD.Float32x4(362, 364, 366, 368),
  153. SIMD.Float32x4(370, 372, 374, 376),
  154. SIMD.Float32x4(378, 380, 382, 384),
  155. SIMD.Float32x4(386, 388, 390, 392),
  156. SIMD.Float32x4(394, 396, 398, 400),
  157. SIMD.Float32x4(402, 404, 406, 408),
  158. SIMD.Float32x4(410, 412, 414, 416),
  159. SIMD.Float32x4(418, 420, 422, 424),
  160. SIMD.Float32x4(426, 428, 430, 432),
  161. ];
  162. verify2DMatrix(buffer, 1000, RESULTS);
  163. WScript.Echo("PASS");