我试图了解 JDK 何时会自动矢量化。我有以下一组问题(尽管谷歌搜索、阅读、实验等)。给定一个简单的循环如下:
for(int i=0; size = size(); i < size; i++) {
a[i] = b[i] * c[i];
method1();
// someObject.method2();
// someHashMap.put(b[i], c[i]);
}
- 为什么需要内联方法调用“method1”(出现在循环中)以进行自动矢量化?(我不明白为什么必须这样做......)
- 也许这是一个“愚蠢”的问题,但如果“someObject.method2()”未被注释怎么办。(让我们假设method2 是巨大的方法,即很多行)。这也会阻止自动矢量化吗?如果 method2 是一个很小的方法(例如,只有 1 或 2 行等?)
- 如果未注释“someHashMap”行怎么办?我们有一个可以在所有 SIMD 中共享的对象/变量这一事实是否也会导致自动矢量化失败?(我看不到它是如何工作的,除非 jdk 在访问“someHashMap”的公共对象/var 时以某种方式自动插入“同步”关键字
- 在我看来,“流”接口将解决上面问题#3 中隐含的问题,因为流中的“收集器”逻辑会自动处理合并单个哈希图,因此我们不需要任何“同步”词。(而且总的来说,流式 API 似乎是一个完美的 API,可以让 jdk 自动使用自动矢量化,只要在创建流式代码时没有“外部变量”(即没有副作用)...... jdk /jit 编译器会在使用标准流接口编写代码时自动执行自动向量化?如果没有,这样做是否有意义(可能在未来的 jdk 版本中,或者可能来自其他供应商的 jdk?)
- 如果循环体包含很多 if 语句等(很多分支,让我们进一步说每个分支都进行大量计算),这是否意味着 a)自动向量化可能是一个坏主意(就像它对于 GPU 一样) 和 b) jit 编译器足够聪明,可以确定自动向量化是一个坏主意,因此它不会自动向量化?
- 我目前正在使用 Oracle jdk8,但是如果使用 jdk9 或 jdk10 等,上面的答案会改变吗?