Advertisement
Guest User

Untitled

a guest
Jun 16th, 2019
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.94 KB | None | 0 0
  1. static unsafe bool BySimdUnrolled (byte[] data)
  2. {
  3. fixed (byte* bytes = data) {
  4. int len = data.Length;
  5. int rem = len % (16 * 16);
  6. Vector16b* b = (Vector16b*)bytes;
  7. Vector16b* e = (Vector16b*)(bytes + len - rem);
  8. Vector16b zero = Vector16b.Zero;
  9.  
  10. while (b < e) {
  11. if ((*(b) | *(b + 1) | *(b + 2) | *(b + 3) | *(b + 4) |
  12. *(b + 5) | *(b + 6) | *(b + 7) | *(b + 8) |
  13. *(b + 9) | *(b + 10) | *(b + 11) | *(b + 12) |
  14. *(b + 13) | *(b + 14) | *(b + 15)) != zero)
  15. return false;
  16. b += 16;
  17. }
  18.  
  19. for (int i = 0; i < rem; i++)
  20. if (data [len - 1 - i] != 0)
  21. return false;
  22.  
  23. return true;
  24. }
  25. }
  26.  
  27. static unsafe bool ByFixedLongUnrolled (byte[] data)
  28. {
  29. fixed (byte* bytes = data) {
  30. int len = data.Length;
  31. int rem = len % (sizeof(long) * 16);
  32. long* b = (long*)bytes;
  33. long* e = (long*)(bytes + len - rem);
  34.  
  35. while (b < e) {
  36. if ((*(b) | *(b + 1) | *(b + 2) | *(b + 3) | *(b + 4) |
  37. *(b + 5) | *(b + 6) | *(b + 7) | *(b + 8) |
  38. *(b + 9) | *(b + 10) | *(b + 11) | *(b + 12) |
  39. *(b + 13) | *(b + 14) | *(b + 15)) != 0)
  40. return false;
  41. b += 16;
  42. }
  43.  
  44. for (int i = 0; i < rem; i++)
  45. if (data [len - 1 - i] != 0)
  46. return false;
  47.  
  48. return true;
  49. }
  50. }
  51.  
  52. LINQ All(b => b == 0) : 6350,4185 ms
  53. Foreach over byte[] : 580,4394 ms
  54. For with byte[].Length property : 809,7283 ms
  55. For with Length in local variable : 407,2158 ms
  56. For unrolled 16 times : 334,8038 ms
  57. For fixed byte* : 272,386 ms
  58. For fixed byte* unrolled 16 times : 141,2775 ms
  59. For fixed long* : 52,0284 ms
  60. For fixed long* unrolled 16 times : 25,9794 ms
  61. SIMD Vector16b equals Vector16b.Zero : 56,9328 ms
  62. SIMD Vector16b also unrolled 16 times : 32,6358 ms
  63.  
  64. private static bool ZeroDetectSseInner(this byte[] arrayToOr, int l, int r)
  65. {
  66. var orVector = new Vector<byte>(0);
  67. var ZeroVector = new Vector<byte>(0);
  68. int sseIndexEnd = l + ((r - l + 1) / Vector<byte>.Count) * Vector<byte>.Count;
  69. int i;
  70. for (i = l; i < sseIndexEnd; i += Vector<byte>.Count)
  71. {
  72. var inVector = new Vector<byte>(arrayToOr, i);
  73. orVector |= inVector;
  74. if (orVector != ZeroVector)
  75. return false;
  76. }
  77. byte overallOr = 0;
  78. for (; i <= r; i++)
  79. overallOr |= arrayToOr[i];
  80. for (i = 0; i < Vector<byte>.Count; i++)
  81. overallOr |= orVector[i];
  82. return overallOr == 0;
  83. }
  84.  
  85. public static bool ZeroValueDetectSse(this byte[] arrayToDetect)
  86. {
  87. return arrayToDetect.ZeroDetectSseInner(0, arrayToDetect.Length - 1);
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement