test2DMatrixSubtraction.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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. function asmModule(stdlib, imports, buffer) {
  6. "use asm";
  7. var log = stdlib.Math.log;
  8. var toF = stdlib.Math.fround;
  9. var imul = stdlib.Math.imul;
  10. var i4 = stdlib.SIMD.Int32x4;
  11. var i4store = i4.store;
  12. var i4swizzle = i4.swizzle;
  13. var i4check = i4.check;
  14. var f4 = stdlib.SIMD.Float32x4;
  15. var f4equal = f4.equal;
  16. var f4lessThan = f4.lessThan;
  17. var f4splat = f4.splat;
  18. var f4store = f4.store;
  19. var f4load = f4.load;
  20. var f4check = f4.check;
  21. var f4abs = f4.abs;
  22. var f4add = f4.add;
  23. var f4sub = f4.sub;
  24. var Float32Heap = new stdlib.Float32Array(buffer);
  25. var Int32Heap = new stdlib.Int32Array(buffer);
  26. var BLOCK_SIZE = 4;
  27. function matrixSubtraction(aIndex, bIndex, cIndex) {
  28. aIndex = aIndex | 0;
  29. bIndex = bIndex | 0;
  30. cIndex = cIndex | 0;
  31. var i = 0, dim1 = 0, dim2 = 0, matrixSize = 0;
  32. var aPiece = f4(0.0, 0.0, 0.0, 0.0), bPiece = f4(0.0, 0.0, 0.0, 0.0);
  33. dim1 = Int32Heap[aIndex << 2 >> 2] | 0;
  34. dim2 = Int32Heap[aIndex + 1 << 2 >> 2] | 0;
  35. matrixSize = imul(dim1, dim2);
  36. //array dimensions don't match
  37. if (((dim2 | 0) != (Int32Heap[bIndex + 1 << 2 >> 2] | 0)) | ((dim1 | 0) != (Int32Heap[bIndex << 2 >> 2] | 0))) {
  38. return -1;
  39. }
  40. Int32Heap[cIndex << 2 >> 2] = dim1;
  41. Int32Heap[cIndex + 1 << 2 >> 2] = dim2;
  42. while ((i|0) < (matrixSize|0)) {
  43. aPiece = f4load(Float32Heap, aIndex + 2 + i << 2 >> 2);
  44. bPiece = f4load(Float32Heap, bIndex + 2 + i << 2 >> 2);
  45. f4store(Float32Heap, cIndex + 2 + i << 2 >> 2, f4sub(aPiece, bPiece));
  46. i = (i + BLOCK_SIZE)|0;
  47. }
  48. return 0;
  49. }
  50. function new2DMatrix(startIndex, dim1, dim2) {
  51. startIndex = startIndex | 0;
  52. dim1 = dim1 | 0;
  53. dim2 = dim2 | 0;
  54. var i = 0, matrixSize = 0;
  55. matrixSize = imul(dim1, dim2);
  56. Int32Heap[startIndex << 2 >> 2] = dim1;
  57. Int32Heap[startIndex + 1 << 2 >> 2] = dim2;
  58. for (i = 0; (i|0) < ((matrixSize - BLOCK_SIZE)|0); i = (i + BLOCK_SIZE)|0) {
  59. f4store(Float32Heap, startIndex + 2 + i << 2 >> 2, f4(toF((i + 1)|0), toF((i + 2)|0), toF((i + 3)|0), toF((i + 4)|0)));
  60. }
  61. for (; (i|0) < (matrixSize|0); i = (i + 1)|0) {
  62. Float32Heap[(startIndex + 2 + i) << 2 >> 2] = toF((i + 1)|0);
  63. }
  64. return (startIndex + 2 + i) | 0;
  65. }
  66. return {
  67. new2DMatrix: new2DMatrix,
  68. matrixSubtraction: matrixSubtraction
  69. };
  70. }
  71. function print2DMatrix(buffer, start) {
  72. var IntHeap32 = new Int32Array(buffer);
  73. var FloatHeap32 = new Float32Array(buffer);
  74. var f4;
  75. var dim1 = IntHeap32[start];
  76. var dim2 = IntHeap32[start + 1];
  77. print(dim1 + " by " + dim2 + " matrix");
  78. for (var i = 0; i < Math.imul(dim1, dim2) ; i += 4) {
  79. f4 = SIMD.Float32x4.load(FloatHeap32, i + start + 2);
  80. print(f4.toString());
  81. }
  82. }
  83. var buffer = new ArrayBuffer(16 * 1024 * 1024);
  84. var m = asmModule(this, null, buffer);
  85. print("2D Matrix Subtraction");
  86. m.new2DMatrix(0, 13, 17);
  87. m.new2DMatrix(500, 13, 17);
  88. m.matrixSubtraction(0, 500, 1000);
  89. m.matrixSubtraction(1000, 0, 1500);
  90. print2DMatrix(buffer, 1000);
  91. print2DMatrix(buffer, 1500);