【发布时间】:2021-12-28 18:37:51
【问题描述】:
关于 SO 评估执行自生成代码的可能性已经存在几个问题。通用的答案是这是可能的,它是在 JIT 编译器中完成的,并通过动态库加载来完成。
应用程序用于优化稀疏卷积,其中稀疏结构应嵌入代码中,因为有条件地跳过乘以零比乘零慢。在数据中编码结构在性能方面也不可行:
do { // actually: don't do this
auto offset = *encoded_offset++;
auto coeff = *encoded_coefficient++;
accum += data[offset] * coeff;
} while (end_of_data); // e.g. offset < 0, or offset == previous offset
对比
...
ldr q5, [x1], 16 ; load data
fmla v0.4s, v5.4s, v8.s[0]
fmla v1.4s, v5.4s, v8.s[1]
fmla v2.4s, v5.4s, v8.s[2]
// fmla v3.4s, v5.4s, v8.s[3] ; omitted, when |weight| < threshold
fmla v4.4s, v5.4s, v8.s[3] ; we reuse the v8.s[3] with a weight that matters
ldr q5, [x1], 16
// fmla v0.4s, v5.4s, v9.s[0] ; omitted, when |weight| < threshold
// fmla v1.4s, v5.4s, v9.s[0] ; omitted
fmla v2.4s, v5.4s, v9.s[0]
fmla v3.4s, v5.4s, v9.s[1]
fmla v4.4s, v5.4s, v9.s[2]
; + several kilobytes of instructions
可以通过模板生成代码,但如果代码是动态生成的,那么效率会高得多(并且考虑到逆向工程的安全性)。
现在的问题是,如何准确地在一些最重要的移动生态系统中调用生成的函数:Ios、android 和可能的 webassembly(使用偏离路线的 WASM (SIMD) 字节码)。 p>
需要发出哪些确切的系统调用才能合法地执行填充了代码的内存块?
【问题讨论】:
标签: android c++ ios webassembly