问题标签 [project-panama]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1984 浏览

java - Java 10 Panama Project - 将 JNI 解决方案移植到巴拿马

我最近一直在阅读有关巴拿马项目的信息。

我知道它将成为 JNI 的下一代替代品——它将允许 Java 开发人员使用 Java 在本机层上进行编码(恕我直言)。

从我可以看出jnr-posix 来看,用法很简单,例如:

我的问题是 - 与 JNI 合作过,并且知道它有多麻烦,是否有将现有 JNI 解决方案移植到巴拿马格式的解决方案?

IE - 检查生成的(通过已弃用的 javah)C 头文件和在 C 中给出的头文件实现,识别可以被巴拿马 API 替换的函数,然后生成 java 输出文件?

还是需要手动重构现有的 JNI 解决方案?

附加链接:

0 投票
1 回答
1776 浏览

java - 为什么 Java SIMD(巴拿马)比标量慢?

我已经跟着 巴拿马SIMD 的英特尔教程学习了。我想对数组做一些简单的操作:

这里是来自网站的标量和向量循环:

当我测量时间时:

我总是得到比标量更长的向量时间。你知道为什么吗?谢谢你。

0 投票
0 回答
994 浏览

java - 不能在 BigInteger 中使用 jdk.incubator.vector 类

我正在尝试使用 Panama 项目中的 Java Vector API 向java.math.BigInteger该类添加一些 SIMD 代码。我克隆了 Panama repo 并构建了一个 JDK:

我能够编译并运行一个使用矢量 API 的简单小程序:

我用于编译和运行程序的命令是:

接下来,我想将代码合并到BigInteger.javaJDK 附带的源代码中。我只是将 import 语句和 main 方法添加到BigInteger.java. 我编译了代码:

当我尝试使用

我收到以下错误:

第 4837 行是以IntSpecies int256Species = ....

所以看起来 java.base 模块无法访问该jdk.incubator.vector模块。请注意,这jdk.incubator.vector是巴拿马 JDK 的一部分。

我的问题是,即使我允许使用 and 选项,为什么我会java.base收到jdk.incubator.vector--add-exports错误--add-reads?我需要给它另一个选项,以便我可以使用jdk.incubator.vectorBigInteger吗?

编辑:添加hg checkouthg branch

编辑^2:巴拿马 API 自从我两周前克隆回购以来发生了变化。代码已更新,因此可以再次编译。

0 投票
0 回答
106 浏览

java - 如何使用 project-panama 访问 pthread api

我一直在试验 project-panama 的早期版本并成功运行了一些示例。

不幸的是,由于内部异常,我无法与本机 pthread api 交互。

这是我尝试过的:

上面的代码段抛出:

我是否遗漏了什么或项目不支持 pthread?

0 投票
1 回答
1192 浏览

java - OpenJDK Panama Vector API jdk.incubator.vector 没有为 Vector 点积提供改进的结果

我正在测试OpenJDK Panama Vector API jdk.incubator.vector 并在 amazon c5.4xlarge 实例上进行了测试。但是在每种情况下,简单的展开矢量点积都无法执行 Vector API 代码。

我的问题是:为什么我无法获得Richard Startin 博客中所示的性能提升。英特尔人员在这次会议聚会中也讨论了同样的性能改进。什么不见​​了?

JMH 基准测试结果:

AWS 实例类型:c5.4xlarge

CPU详细信息:

代码片段。请参阅此 github 存储库中的完整代码

JavaDocExample :这是在 OpenJDK 的 vectorIntrinsic 分支的 java doc 中共享的。

FloatVector256DotProduct :此代码无耻地从Richard Startin 的博客中复制。感谢理查德富有洞察力的博客。

如this SO question所示,编译和使用OpenJDK Panama dev vectorIntrinsic分支的过程

我检查了为什么它应该起作用的事情。

  1. lscpu 显示各种 avx 标志。
  2. 我选择了应该支持 AVX 指令集的 HVM AMI。https://aws.amazon.com/ec2/instance-types/ 说:† AVX、AVX2 和增强联网仅在使用 HVM AMI 启动的实例上可用。
  3. 我可以编译矢量代码,这意味着我正在使用 OpenJDK 的适当分支。我使用 --add-modules=jdk.incubator.vector VM 参数运行我的代码。我还在 [this intel blog](https://software.intel.com/en-us/articles/vector-api-developer-program-for-java) 中添加了一些其他 VM 参数,例如 state:-XX:TypeProfileLevel= 121
  4. 我检查了它确实包含 vmulps 指令的编译汇编代码。虽然很难找到它们,因为我在向量 api 代码中调用方法,并且乘法发生在调用的 mul/fma 方法中的其他一些地方。
  5. 我已经使用 64、128、256、512 等不同的 SIZE 以及使用“FloatVector.SPECIES_PREFERRED”进行了更多测试。在所有情况下,矢量 api 代码都比带有展开的简单乘法代码慢得多。
0 投票
0 回答
268 浏览

java - 如何在不复制数据的情况下将 IntBuffer 转换为 ByteBuffer

我的 Scala/Java 代码有一个大型(数百兆字节)整数数组。我会int[]使用java.nio. nio此外,当我在我的套接字通道上收到任何数据时,我会使用这些数据int[]而不进行复制。

所有nio操作都需要ByteBuffer,而ByteBuffer只能换行byte []

我可以分配一个ByteBuffer,然后将我的数组使用asIntBuffer,但它会复制随机数组,我必须存储我的数据两次。

我正在使用项目巴拿马 openjdk,因此任何新技巧(如使用Pointer<>)都可以帮助我。

TL;DR:在 Java 或 Scala 中,如何访问我的整数数组ByteBufferint[].

0 投票
1 回答
230 浏览

java - 在 Rust 项目的 C 绑定上运行 jextract 时“找不到 cstdarg 文件”

我正在尝试使用 Rust 编写的简单整数加法函数与 Java 的 Project Panama 一起使用。使用 crate 生成绑定cbindgen后,运行 jextract 时出现以下错误:

我已经查看了给出的示例,但无法破译我做错了什么。

这是我的库文件:

和生成的绑定(也需要源代码cstdint,我猜?):cstdlibnew

我需要做什么jextract才能找到这些文件?

0 投票
1 回答
1224 浏览

java - 在 Rust 项目的 C 绑定上运行 jextract 时出现致命错误“'stdlib.h' 文件未找到”

我想使用 Project Panama 的jextract工具来构建与 Rust 库的 Java 绑定。运行以下命令时,出现错误:

我很困惑,因为包含路径包含stdlib.h

错误行仅包含#include_next <stdlib.h>.

我的 Rust 源代码是一个简单的函数:

bindings.h头由cbindgencrate 生成:

我需要做什么jextract才能找到stdlib.h

0 投票
1 回答
158 浏览

java - 如何使用 Java Panama FFI 访问 MemoryLayout 中的 C_POINTER

使用 JDK 16 中的 FFI 预览,我有这样的内存布局:

然后,我在本机代码的回调中收到指向此类结构的指针:

在 JDK 代码中引发异常jdk.internal.foreign.Utils

根据巴拿马文档, a 的 Java 载体C_POINTER应该是MemoryAddress,但这在这里不起作用。

那么使用 long 来访问此类指针是否正确?或者是其他东西?

0 投票
1 回答
141 浏览

java - 如何使用 Java Panama 在本机内存中存储对象数组

我想使用 Project Panama 的外部内存访问 API 在本机内存中实现数据结构。

为了做到这一点,我需要一个底层对象数组 ( Object[]) 用于条目。

在外部内存访问 API 的所有示例中,MemorySegments 仅用于存储和检索原语,如下所示:

有没有办法将非基元存储在 MemorySegment(例如对象)中?如果是这种情况,当 VarHandles 仅支持原始载体时,如何使用 VarHandle 取消引用该 MemorySegment?