Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- static unsafe bool BySimdUnrolled (byte[] data)
- {
- fixed (byte* bytes = data) {
- int len = data.Length;
- int rem = len % (16 * 16);
- Vector16b* b = (Vector16b*)bytes;
- Vector16b* e = (Vector16b*)(bytes + len - rem);
- Vector16b zero = Vector16b.Zero;
- while (b < e) {
- if ((*(b) | *(b + 1) | *(b + 2) | *(b + 3) | *(b + 4) |
- *(b + 5) | *(b + 6) | *(b + 7) | *(b + 8) |
- *(b + 9) | *(b + 10) | *(b + 11) | *(b + 12) |
- *(b + 13) | *(b + 14) | *(b + 15)) != zero)
- return false;
- b += 16;
- }
- for (int i = 0; i < rem; i++)
- if (data [len - 1 - i] != 0)
- return false;
- return true;
- }
- }
- static unsafe bool ByFixedLongUnrolled (byte[] data)
- {
- fixed (byte* bytes = data) {
- int len = data.Length;
- int rem = len % (sizeof(long) * 16);
- long* b = (long*)bytes;
- long* e = (long*)(bytes + len - rem);
- while (b < e) {
- if ((*(b) | *(b + 1) | *(b + 2) | *(b + 3) | *(b + 4) |
- *(b + 5) | *(b + 6) | *(b + 7) | *(b + 8) |
- *(b + 9) | *(b + 10) | *(b + 11) | *(b + 12) |
- *(b + 13) | *(b + 14) | *(b + 15)) != 0)
- return false;
- b += 16;
- }
- for (int i = 0; i < rem; i++)
- if (data [len - 1 - i] != 0)
- return false;
- return true;
- }
- }
- LINQ All(b => b == 0) : 6350,4185 ms
- Foreach over byte[] : 580,4394 ms
- For with byte[].Length property : 809,7283 ms
- For with Length in local variable : 407,2158 ms
- For unrolled 16 times : 334,8038 ms
- For fixed byte* : 272,386 ms
- For fixed byte* unrolled 16 times : 141,2775 ms
- For fixed long* : 52,0284 ms
- For fixed long* unrolled 16 times : 25,9794 ms
- SIMD Vector16b equals Vector16b.Zero : 56,9328 ms
- SIMD Vector16b also unrolled 16 times : 32,6358 ms
- private static bool ZeroDetectSseInner(this byte[] arrayToOr, int l, int r)
- {
- var orVector = new Vector<byte>(0);
- var ZeroVector = new Vector<byte>(0);
- int sseIndexEnd = l + ((r - l + 1) / Vector<byte>.Count) * Vector<byte>.Count;
- int i;
- for (i = l; i < sseIndexEnd; i += Vector<byte>.Count)
- {
- var inVector = new Vector<byte>(arrayToOr, i);
- orVector |= inVector;
- if (orVector != ZeroVector)
- return false;
- }
- byte overallOr = 0;
- for (; i <= r; i++)
- overallOr |= arrayToOr[i];
- for (i = 0; i < Vector<byte>.Count; i++)
- overallOr |= orVector[i];
- return overallOr == 0;
- }
- public static bool ZeroValueDetectSse(this byte[] arrayToDetect)
- {
- return arrayToDetect.ZeroDetectSseInner(0, arrayToDetect.Length - 1);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement