在Go语言中优雅地使用AVX512

在Go语言中优雅地使用AVX512

AVX512是英特尔发布的最新最新一代SIMD指令,能够在一个指令周期内对512位数据进行处理,相当于16个单精度浮点数或者8个双精度浮点数。Gorse推荐系统中的推荐模型训练和推理过程需要大量的向量计算工作,AVX512理论上能够带来一定的加速效果。然而比较遗憾的是,Go语言的编译器并不能自动生成使用SIMD指令的机器码。

MinIO曾经开源过一个将英特尔汇编转换为Go汇编的工具c2goasm。首先,将需要向量化的函数用C语言实现,通过Clang编译出包含SIMD指令的汇编。然后,由于Go汇编支持AVX512的,将Intel汇编指令转换成Go汇编,即可通过汇编调用SIMD实现的函数。c2goasm的方案十分有效,然而项目已经将近4年没有更新,经过测试也无法处理AVX512指令。


技术分享SIMD大约 15 分钟
使用Go Modules引入前端产物到Go项目

使用Go Modules引入前端产物到Go项目

能够编译成一个单独的二进制文件是Go语言的一大特色,避免了部署时繁琐的依赖管理。然而,如果项目包含了前端代码,在编译的时候就需要想办法将前端产物嵌入到Go二进制文件中。编译流程大致如下:

  1. 编译前端代码。
  2. 将前端生成物转换为Go嵌入文件。例如,rakyll/statik这个项目就能够将任何文件嵌入到Go源代码中。另外,Go语言目前提供了官方资源嵌入方案embed,可以在编译期间完成嵌入,免去步骤2。
  3. 构建Go代码。

技术分享前端大约 3 分钟