首页 / C# / SSE指令检查字节数组是否为零C#
SSE指令检查字节数组是否为零C#
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了SSE指令检查字节数组是否为零C#,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2445字,纯文字阅读大概需要4分钟。
内容图文
假设我有一个byte [],想检查所有字节是否为零. For循环是一种显而易见的方法,而LINQ All()是一种理想的方法,但是最高性能至关重要.
如何使用Mono.Simd加快检查字节数组是否为零?我正在寻找最先进的方法,而不仅仅是正确的解决方案.
解决方法:
最佳代码如下. full source中提供了其他方法和时间测量.
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;
}
}
时间测量(在256MB阵列上):
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
结论:
> Mono.Simd仅具有有限的说明集.我没有找到用于计算标量和(向量)或最大(向量)的指令.但是,有矢量相等运算符返回布尔值.
>循环展开是一项强大的技术.即使是最快的代码也可以从中受益.
> LINQ非常慢,因为它使用来自lambda表达式的委托.如果您需要最先进的性能,那么显然这不是可行的方法.
>所提供的所有方法都使用short circuit evaluation,这意味着它们一旦遇到非零值便立即终止.
> SIMD代码最终被击败.关于SOD是否确实使事情变得更快,还有其他问题.
同行评审上的Posted this code,到目前为止已发现并修复了2个错误.
内容总结
以上是互联网集市为您收集整理的SSE指令检查字节数组是否为零C#全部内容,希望文章能够帮你解决SSE指令检查字节数组是否为零C#所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。