【发布时间】:2017-04-16 08:42:27
【问题描述】:
我正在尝试查找字符的第一个实例,在本例中为 '"' 使用 simd(AVX2 或更早版本)。我想使用 _mm256_cmpeq_epi8,但是我需要一种快速的方法来查找是否有任何__m256i 中的结果字节已设置为 0xFF。然后计划使用 _mm256_movemask_epi8 将结果从字节转换为位,并使用 ffs 获得匹配索引。使用一次移动一部分是否更好_mm_movemask_epi8?还有其他建议吗?
【问题讨论】:
-
我应该补充一点,simd 不是必需的,一般来说我只是在寻找最快的方法。也许有点魔法?
-
你的基本想法是正确的——我感觉可能已经有一个 SIMD 实现,就像你在 StackOverflow 上一个问题中描述的那样,但是快速搜索并没有发现它。请注意,您正在实现的实际上是
strchr(或memchr,如果您知道长度),并且很可能已经有可用的SIMD 优化实现。另请注意,对于尚未在缓存中的字符串,您的函数可能会受到内存带宽的限制。 -
Here's an SSE implementation which scans a string for a
'\0'(实际上是strlen),你也许可以适应。