I posted检查字节[]为全零的方法。 Mono.Simd提供如此高的性能,我想知道这是否可能。SSE指令违反RAM理论带宽
static unsafe bool IsAllZeros(byte[] data)
{
fixed (byte* bytes = data) {
int len = data.Length;
int rem = len % (16*16);
Vector16b* b = (Vector16b*)bytes;
Vector16b* e = b + len/(16*16);
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;
}
}
上述代码256 MB在2,6477毫秒提供94 GB/s。 这甚至可能吗?
我的DDR2内存具有800 Mhz的频率。 Wikipedia给出了理论最大带宽为800M * 2 * 64 * 2 = 25GB/s的公式。
你只处理数组的1/16。 –
也是'b + = 16'正确吗?它不应该是'b ++'吗? –
循环在一次迭代中处理16个向量,这就是为什么它会移动16个。顺便说一下,您应该将其发布到代码审阅页面上。 https://codereview.stackexchange.com/questions/108470/sse-instruction-to-check-if-byte-array-is-zeroes-c – ArekBulski