apernet / hysteria

Hysteria is a powerful, lightning fast and censorship resistant proxy.
https://v2.hysteria.network/
MIT License
15.12k stars 1.69k forks source link

[功能请求] AVX #631

Open icls1337 opened 1 year ago

icls1337 commented 1 year ago

功能描述

编译x86-64-v2版本。

这个功能的必要性

拯救渣机

当前可用的替代方案

不知道捏

补充

渣机2680v2兴奋地尝试avx版本后提示:This program can only be run on AMD64 processors with v3 microarchitecture support.。 居然要x86-64-v3,我要是有这还用得着avx版本吗!而且V3是优先AVX2!

CCCAUCHY commented 1 year ago

那应该直接SSE一步到位

icls1337 commented 1 year ago

那应该直接SSE一步到位

大多数编译器应该都是默认SSE2,所以可以再加一个SSE4.2? https://store.steampowered.com/hwsurvey/Steam-Hardware-Software-Survey-Welcome-to-Steam?l=schinese 根据steam6月硬件调查,在安装有steam的电脑上,SSE4.2有着99.23%拥有率。

CCCAUCHY commented 1 year ago

那应该直接SSE一步到位

大多数编译器应该都是默认SSE2,所以可以再加一个SSE4.2? https://store.steampowered.com/hwsurvey/Steam-Hardware-Software-Survey-Welcome-to-Steam?l=schinese 根据steam6月硬件调查,在安装有steam的电脑上,SSE4.2有着99.23%拥有率。

会让人有想用steam的欲望的电脑也算渣机?

icls1337 commented 1 year ago

那应该直接SSE一步到位

大多数编译器应该都是默认SSE2,所以可以再加一个SSE4.2? https://store.steampowered.com/hwsurvey/Steam-Hardware-Software-Survey-Welcome-to-Steam?l=schinese 根据steam6月硬件调查,在安装有steam的电脑上,SSE4.2有着99.23%拥有率。

会让人有想用steam的欲望的电脑也算渣机?

你说这个和拥有率没关系,几人民币一个月的vps都有AVX指令集。

HeXis-YS commented 1 year ago

目前Golang工具链还不能(并且估计以后也不会)自动生成AVX指令,AVX指令的使用只能依靠汇编。 Golang工具链中控制AVX相关功能的地方有三个:

  1. useAVXmemmove:使用AVX memmove进行内存复制,但是这个功能在Intel SandyBridge和IvyBridge架构上(换句话说,在只有AVX而没有AVX2指令集的英特尔CPU上)被禁用。因为AVX指令集在这两个架构上的实现并不是很高效。
  2. HasAVX运行时判断:在Go程序启动时检测CPU是否支持AVX指令集,如果支持则选择相应的代码路径。这一功能也需要相应的函数AVX指令集的汇编代码。
  3. hasAVX定义:控制AVX汇编代码的条件编译,默认由GOAMD64_v3控制(也就是说必须要v3才能启用)。

可以看出在Golang中,AVX指令集的使用高度依赖汇编。但是Golang使用了x86-64微架构等级(v1、v2、v3、v4)来控制代码生成,而不是精确到某个确切的架构或指令集组合。这就导致对v3来讲,有AVX2就没有必要使用AVX;而对于v2来讲,它的标准本身就是不支持AVX指令集的。因此AVX指令集在Golang中几乎没人使用。当然,也有一些第三方库,比如sha256-simd仍然支持AVX。 综上,使用AVX指令集或许可以提供好处,但是在Go中使用AVX很困难。

w123456w30w commented 1 year ago

目前Golang工具链还不能(并且估计以后也不会)自动生成AVX指令,AVX指令的使用只能依靠汇编。 Golang工具链中控制AVX相关功能的地方有三个:

  1. useAVXmemmove:使用AVX memmove进行内存复制,但是这个功能在Intel SandyBridge和IvyBridge架构上(换句话说,在只有AVX而没有AVX2指令集的英特尔CPU上)被禁用。因为AVX指令集在这两个架构上的实现并不是很高效。
  2. HasAVX运行时判断:在Go程序启动时检测CPU是否支持AVX指令集,如果支持则选择相应的代码路径。这一功能也需要相应的函数AVX指令集的汇编代码。
  3. hasAVX定义:控制AVX汇编代码的条件编译,默认由GOAMD64_v3控制(也就是说必须要v3才能启用)。

可以看出在Golang中,AVX指令集的使用高度依赖汇编。但是Golang使用了x86-64微架构等级(v1、v2、v3、v4)来控制代码生成,而不是精确到某个确切的架构或指令集组合。这就导致对v3来讲,有AVX2就没有必要使用AVX;而对于v2来讲,它的标准本身就是不支持AVX指令集的。因此AVX指令集在Golang中几乎没人使用。当然,也有一些第三方库,比如sha256-simd仍然支持AVX。 综上,使用AVX指令集或许可以提供好处,但是在Go中使用AVX很困难。

GO在不指定微架构等级的情况下默认编译v1吧?这样的话编译出来的二进制根据go的wiki来看SSE3/4.1/4.2都是没支持的

HeXis-YS commented 1 year ago

目前Golang工具链还不能(并且估计以后也不会)自动生成AVX指令,AVX指令的使用只能依靠汇编。 Golang工具链中控制AVX相关功能的地方有三个:

  1. useAVXmemmove:使用AVX memmove进行内存复制,但是这个功能在Intel SandyBridge和IvyBridge架构上(换句话说,在只有AVX而没有AVX2指令集的英特尔CPU上)被禁用。因为AVX指令集在这两个架构上的实现并不是很高效。
  2. HasAVX运行时判断:在Go程序启动时检测CPU是否支持AVX指令集,如果支持则选择相应的代码路径。这一功能也需要相应的函数AVX指令集的汇编代码。
  3. hasAVX定义:控制AVX汇编代码的条件编译,默认由GOAMD64_v3控制(也就是说必须要v3才能启用)。

可以看出在Golang中,AVX指令集的使用高度依赖汇编。但是Golang使用了x86-64微架构等级(v1、v2、v3、v4)来控制代码生成,而不是精确到某个确切的架构或指令集组合。这就导致对v3来讲,有AVX2就没有必要使用AVX;而对于v2来讲,它的标准本身就是不支持AVX指令集的。因此AVX指令集在Golang中几乎没人使用。当然,也有一些第三方库,比如sha256-simd仍然支持AVX。 综上,使用AVX指令集或许可以提供好处,但是在Go中使用AVX很困难。

GO在不指定微架构等级的情况下默认编译v1吧?这样的话编译出来的二进制根据go的wiki来看SSE3/4.1/4.2都是没支持的

实际上并非如此。Go有两种方法来使用高级指令集。 一种是在编译时生成相关指令集的代码(或条件编译相应的汇编代码)。以这种方式生成的二进制程序一般不具有后向兼容性(也就是说v2的程序不能在v1的CPU上运行),代码路径在编译时就已经确定。但是Go编译器(至少目前来说)不会生成任何v2特定的指令集代码。汇编开关也仅限于hasSSE42hasPOPCNT,这两个开关仅影响bytealg包(可能会有少量第三方包)。 另一种是运行时检测。这种方法将所有支持的指令集实现全部打包进程序,在程序启动时检测CPU是否支持相应的指令集,并选择相应的实现。也就是说,即使是v1的程序,仍然包含AVX2的实现,并且可以在支持它的CPU上正确调用。 从这方面来说,v1的二进制程序就已经包含了绝大多数可用于v2的优化,为v2编译一个单独的二进制程序不会带来非常明显的好处。