首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java自动矢量化

Java自动矢量化
EN

Stack Overflow用户
提问于 2018-09-03 21:24:30
回答 1查看 563关注 0票数 2

我想知道JDK什么时候会自动矢量化。我有以下一组问题(尽管我在谷歌上搜索,阅读,实验等)。下面给出一个简单的循环:

代码语言:javascript
复制
for(int i=0; size = size(); i < size; i++) {
   a[i] = b[i] * c[i];
   method1();
   // someObject.method2();
   // someHashMap.put(b[i], c[i]);
}

  1. 为什么方法调用"method1“(出现在循环中)需要内联,以便自动向量化发生?(我不明白为什么这一定是necessary....)
  2. Perhaps这个“愚蠢”的问题,但是如果"someObject.method2()“没有注释呢?(让我们假设method2是一个很大的方法,即有很多行)。这也会阻止自动矢量化吗?如果method2是一个很小的方法(例如只有1到2行等等),
  3. 如果"someHashMap“行没有注释呢?我们有一个在所有SIMD中共享的对象/变量会不会导致自动矢量化也失败?(我不明白它是如何工作的,除非jdk在访问"someHashMap"
  4. It的公共对象/var时以某种方式自动插入一个"syncronization“关键字。在我看来,”流“接口将直接解决上面问题#3中暗示的问题,因为streams中的”收集器“逻辑将自动处理合并单个哈希图,因此我们不需要任何"synchronized”字。(一般来说,似乎流式API是允许jdk自动使用自动矢量化的完美API,只要在创建流式code...Does jdk/jit编译器时没有“外部变量”(即没有副作用),那么当使用标准流式接口编写代码时,jdk/jit编译器会自动执行自动矢量化吗?如果不是,那么这样做不是很有意义吗(也许在未来的jdk版本中,或者其他供应商的jdk中?)
  5. 如果循环的主体包含许多if语句等(很多分支,假设每个分支做很多计算),这是否意味着a)自动向量化可能是一个坏主意(就像它对GPU一样)和b) jit编译器足够聪明,可以确定自动向量化是一个坏主意,所以它不会使用当前使用的Oracle jdk8,但是,如果使用jdk9或jdk10等,上面的答案会发生变化吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-04 07:30:54

要回答您的问题(1),原则上,如果Java编译器分析了method1()并确定它没有任何影响自动向量化的副作用,那么它可以在存在非内联method1()调用的情况下进行优化。具体地说,编译器可以证明该方法是"const“的(没有副作用,也不会从全局内存中读取),这通常会在调用点实现许多优化,而不需要内联。它还可能证明更受限制的属性,例如不读取或写入特定类型的数组,这也足以允许在这种情况下进行自动向量化。

然而,在实践中,我不知道目前有任何Java编译器可以完成这种优化。如果相信this answer的话,在热点中:“非内联方法调用对于JIT编译器来说通常是不透明的。”大多数Java编译器都以这样或那样的方式基于Hotspot,所以我不期望有一个成熟的Java编译器可以在Hotspot无法做到这一点的情况下做到这一点。

这个答案还涵盖了为什么这样的过程间分析(IPA)可能既困难又不是特别有用的一些原因。特别是,可以证明非平凡事情的方法通常足够小,以至于它们无论如何都是内联的。我不确定我是否完全同意:有人可能会争辩说,Java之所以积极地内联,部分原因是它不支持IPA,所以强大的IPA可能会提供减少内联的能力,从而减少运行时代码占用空间和JIT时间。

您在(2)或(3)中询问的其他方法变体不会改变任何东西:编译器仍然需要IPA才能将其向量化,而据我所知Java编译器没有IPA。

(4)和(5)似乎应该作为完全不同的问题来问。

关于(6)我不认为它会改变,但是对于OpenJDK热点邮件列表来说,这将是一个很好的问题:我认为你会得到一个很好的答案。

最后,值得注意的是,即使在没有IPA和对method1()一无所知的情况下,如果编译器能够证明abc中的任何一个都没有转义,它也可以优化它们的数学运算。一般来说,这似乎没有什么用处:这意味着所有这些变量都会被分配到这个函数中(或者某个内联到这个函数中的函数),而我可以想象,在大多数实际场景中,至少有一个变量是由调用者传入的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52150686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档