我目前代表Not a典型机构担任SSIM.js和jest-image-snapshot的作者和贡献者。我正在执行的许多工作导致创建新算法来比较 Javascript 中的图像。在使用 AssemblyScript 和 WebAssembly 进行大量研究和测试后,我发现使用纯 JS 经常可以获得性能更高、更便携的解决方案,而不是使用这两种技术中的任何一种。然而,这只有在对生成的程序集进行广泛的代码审查并进行多次实验后才会发生。
我想了解的是是否有办法让 Node.JS/libV8 自动矢量化代码段。作为一个例子,我有一个两遍循环,它计算图像中每个像素的前缀和,水平然后垂直。跳过水平前缀和(为了使用纯汇编实现真正的性能改进而进行矢量化可能具有挑战性),垂直前缀和应该非常容易优化。下面是一个例子:
for (let h = 0; h + 1 < height; ++h) {
for (let w = 0; w < width; ++w) {
let above = pSumArray[h * width + w];
let current = pSumArray[(h + 1) * width + w];
pSumArray[(h + 1) * width + w] = above + current;
}
}
Run Code Online (Sandbox Code Playgroud)
这需要所有预先存在的水平前缀和计算,并在图像中添加相邻的行,一次一行,一直到最后。
汇编器输出如下所示:
0x11afd3a4adb1 1d1 c4a17b1044c10f vmovsd xmm0,[rcx+r8*8+0xf]
0x11afd3a4adb8 …Run Code Online (Sandbox Code Playgroud) PCMPGTQ 是在 sse4.2 中引入的,它为产生掩码的 64 位数字提供大于符号的比较。
如何在 sse4.2 之前的指令集上支持此功能?
更新:同样的问题适用于带有 Neon 的 ARMv7,它也缺少 64 位比较器。在这里可以找到姊妹问题: 在 ARMv7a 和 Neon 上通过 64 位带符号比较支持 CMGT 的最有效方法是什么?