meta.Vectors背后的黑魔法是什么?
what is dark magic behind meta.Vectors?
在基于通用算法和迭代器实现了一些向量代数之后,我决定 运行 一些基准测试。这个想法是将自定义向量与 meta.Vector
的性能(进行加法和缩放)进行比较。
当向量的大小设置为 10 时,自定义向量的性能略优于 meta.Vector
s。当向量的大小设置为 100 时,meta.Vector
s 略优于自定义向量。当向量的大小设置为 1000 时,自定义向量执行加法的速度是 meta.Vector
s 的两倍,缩放速度比 meta.Vector
s 稍慢(使用 @splat
)。
最有趣的是编译时间——它们随着向量大小的增长而增长(没有测量,无法判断编译时间是否与向量大小呈线性关系)。当向量的大小设置为 10_000 时,我最终(经过漫长的等待)收到 shell returned 137
错误消息(在编译期间);在我注释掉任何提及 meta.Vector
之后,代码编译得很好。
所以我的问题是,什么样的(编译器?)黑魔法让 1000 大小的 meta.Vector
s 工作得如此之快,我可以用它来使我的代码更快吗?
P. S.:基准测试是 运行 和 -O ReleaseFast,所有变量都标记为 var
P. P. S.:在调试模式下代码 10_000-sized meta.Vector
s 最终编译
据我所知,它所做的就是明确利用 LLVM 的 SIMD 支持。
在基于通用算法和迭代器实现了一些向量代数之后,我决定 运行 一些基准测试。这个想法是将自定义向量与 meta.Vector
的性能(进行加法和缩放)进行比较。
当向量的大小设置为 10 时,自定义向量的性能略优于 meta.Vector
s。当向量的大小设置为 100 时,meta.Vector
s 略优于自定义向量。当向量的大小设置为 1000 时,自定义向量执行加法的速度是 meta.Vector
s 的两倍,缩放速度比 meta.Vector
s 稍慢(使用 @splat
)。
最有趣的是编译时间——它们随着向量大小的增长而增长(没有测量,无法判断编译时间是否与向量大小呈线性关系)。当向量的大小设置为 10_000 时,我最终(经过漫长的等待)收到 shell returned 137
错误消息(在编译期间);在我注释掉任何提及 meta.Vector
之后,代码编译得很好。
所以我的问题是,什么样的(编译器?)黑魔法让 1000 大小的 meta.Vector
s 工作得如此之快,我可以用它来使我的代码更快吗?
P. S.:基准测试是 运行 和 -O ReleaseFast,所有变量都标记为 var
P. P. S.:在调试模式下代码 10_000-sized meta.Vector
s 最终编译
据我所知,它所做的就是明确利用 LLVM 的 SIMD 支持。