使用C#的Vector<T>**,,如何最有效地向量化查找_的索引_的操作?**
作为约束,集合始终是整数基元的Span<T>,最多包含一个匹配元素。
我想出了一个似乎没问题的解决方案,但我很好奇我们是否能做得更好。以下是一种方法:
Vector<T>。Vector.Equals(),以获得包含单个匹配槽中的1的掩码(如果没有匹配,则只包含0)。Vector.Dot()。每个索引将被乘以0,除了潜在的匹配指数,它将被乘以1。我们得到的是那些乘法的和,或者是0,或者是匹配元素的基于1的索引。发布于 2019-12-14 11:01:04
正如我所看到的,简单的Span.IndexOf已经在使用Intrinsics来搜索一个简单的值。您甚至不需要转换为char来使用它,因为MemoryExtensions.IndexOf只关心大小和Unsafe.SizeOf<ushort>() == sizeof(char)!
同样在JsonReaderHelper.IndexOfOrLessThan中,您将找到一个更复杂的向量化搜索示例。它使用字节搜索,但我相信,如果Span<ushort>.IndexOf不合适,您可以根据需要对其进行调整。
发布于 2019-07-09 15:12:52
您希望编译器生成的x86 pcmpeqb、pmovmskb或movmskps (具有1字节或4字节元素的向量到位掩码),然后如果掩码为非零,则对第一集位(bsf或tzcnt)进行位扫描。
那将比整数点积更有效!
您已经有了相等的比较,我想我已经看到了其他的C# Q&比如一个内建的向量->位图。如果有人想编辑这个答案,或者用编译/JIT的C#发布自己的答案,请这样做。我不知道C#,我只是来参加x86 SIMD的。
https://stackoverflow.com/questions/56955433
复制相似问题