看起来像是golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s在构建时无条件地使用了PSHUFB指令,即使GOAMD64=v1。PSHUFB是SSSE3的一部分,而SSSE3只有v2+版本。在我编写的类似chacha8rand的代码中,我不想因为两份代码和一个运行时开关的开销,所以我只是做了
// ROL16 rotates the uint32s in register R left by 16, using temporary T if needed.
#ifdef GOAMD64_v2
#define ROL16(R, T) PSHUFB ·rol16<>(SB), R
#else
#define ROL16(R, T) ROL(16, R, T)
#endif
// ROL8 rotates the uint32s in register R left by 8, using temporary T if needed.
#ifdef GOAMD64_v2
#define ROL8(R, T) PSHUFB ·rol8<>(SB), R
#else
#define ROL8(R, T) ROL(8, R, T)
#endif
这对于这段代码来说可能也没关系,因为较新的x86芯片最终还是会使用AVX代码路径。
4条答案
按热度按时间vuktfyat1#
https://go.dev/cl/538786提到了这个问题:
chacha20poly1305: guard PSHUFP usage with GOAMD64_v2
35g0bw712#
这是否需要回溯到1.20和1.21版本?
我认为是的。重新开放以做出这个决定。
gdrx4gfi3#
你好,我有一个用户报告说由于这个更改(rfjakob/gocryptfs#828),gocryptfs的性能下降了15%。CPU是
cpu: Intel(R) Core(TM) i3-2100 CPU @ 3.10GHz
,所以我猜它太旧了,不支持AVX,但它确实有PSHUFB。能否在运行时检测到PSHUFB?
suzh9iv84#
你好,@rfjakob,感谢你报告这个问题。我认为对于PSHUFB的特性检测没有被考虑,它只是与其他amd64v2特性一起分组。你介意打开一个新的问题来讨论这个吗?