kvSIMD.swift 是一个跨平台、易于向量化的 SIMD 框架接口的 Swift 实现。
包的结构设计是为了在 SIMD 框架不可用时,可以通过 import simd
表达式导入 kvSIMD.swift。 因此,import simd
表达式在 SIMD 框架可用时导入该框架,否则导入 kvSIMD.swift。
kvSIMD.swift 经过单元测试覆盖。
提供了一个简单的基准测试控制台应用程序。 它位于 /Benchmark
目录中。 基准测试在 SIMD 框架可用的平台上运行。 最新报告可在 /Benchmark/report.md
路径下找到。
对于任何平台没有明确的限制。 因此,假设 kvSIMD.swift 可以在 Swift 可用的任何平台上编译。 该包构建于 macOS、Linux (Ubuntu 22.04) 和 Windows (10 x64) 上。
.package(url: "https://github.com/keyvariable/kvSIMD.swift.git", from: "1.0.4")
.product(name: "kvSIMD", package: "kvSIMD.swift")
import simd
SIMD 的意思是 “单指令,多数据”。 在 CPU 上,它是一组指令,接收值的元组并一次性处理它们以及各种相关指令。 将常规代码转换为 SIMD 兼容代码的过程称为向量化。 现代编译器可以很好地向量化代码,但结果仍然取决于代码风格和开发人员的技能。 因此,最好使用 SIMD 兼容的类型显式组织数据并使用相关函数。
假设 v 是一个 Float
值,需要找到 2∙v, 4∙v, 8∙v 和 16∙v。 这可以通过以下方式完成
let product = simd_float4(repeating: v) * [ 2, 4, 8, 16 ]
假设 n 是 3D 空间中平面的法线,d 是从平面到原点的距离。 那么,返回一个布尔值的函数,指示点 v 是否在平面上,精度为 eps,可以这样实现
func IsPoint(_ v: simd_float3, on plane: simd_float4, eps: Float) -> Bool {
abs(simd_dot(simd_float4(v, 1), plane)) < eps
}
请注意,平面表示为 simd_float4
值:前三个元素是 n,第四个分量是 d。 平面可以从法线的 (nx, ny, nz) 分量和 d 这样生成
func MakePlane(nx: Float, ny: Float, nz: Float, d: Float) -> simd_float4 {
simd_float4(nx, ny, nz, d)
}