问题标签 [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.
java - Java 10 Panama Project - 将 JNI 解决方案移植到巴拿马
我最近一直在阅读有关巴拿马项目的信息。
我知道它将成为 JNI 的下一代替代品——它将允许 Java 开发人员使用 Java 在本机层上进行编码(恕我直言)。
从我可以看出jnr-posix 来看,用法很简单,例如:
我的问题是 - 与 JNI 合作过,并且知道它有多麻烦,是否有将现有 JNI 解决方案移植到巴拿马格式的解决方案?
IE - 检查生成的(通过已弃用的 javah)C 头文件和在 C 中给出的头文件实现,识别可以被巴拿马 API 替换的函数,然后生成 java 输出文件?
还是需要手动重构现有的 JNI 解决方案?
附加链接:
java - 不能在 BigInteger 中使用 jdk.incubator.vector 类
我正在尝试使用 Panama 项目中的 Java Vector API 向java.math.BigInteger
该类添加一些 SIMD 代码。我克隆了 Panama repo 并构建了一个 JDK:
我能够编译并运行一个使用矢量 API 的简单小程序:
我用于编译和运行程序的命令是:
接下来,我想将代码合并到BigInteger.java
JDK 附带的源代码中。我只是将 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.vector
类BigInteger
吗?
编辑:添加hg checkout
和hg branch
编辑^2:巴拿马 API 自从我两周前克隆回购以来发生了变化。代码已更新,因此可以再次编译。
java - 如何使用 project-panama 访问 pthread api
我一直在试验 project-panama 的早期版本并成功运行了一些示例。
不幸的是,由于内部异常,我无法与本机 pthread api 交互。
这是我尝试过的:
上面的代码段抛出:
我是否遗漏了什么或项目不支持 pthread?
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分支的过程
我检查了为什么它应该起作用的事情。
- lscpu 显示各种 avx 标志。
- 我选择了应该支持 AVX 指令集的 HVM AMI。https://aws.amazon.com/ec2/instance-types/ 说:† AVX、AVX2 和增强联网仅在使用 HVM AMI 启动的实例上可用。
- 我可以编译矢量代码,这意味着我正在使用 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
- 我检查了它确实包含 vmulps 指令的编译汇编代码。虽然很难找到它们,因为我在向量 api 代码中调用方法,并且乘法发生在调用的 mul/fma 方法中的其他一些地方。
- 我已经使用 64、128、256、512 等不同的 SIZE 以及使用“FloatVector.SPECIES_PREFERRED”进行了更多测试。在所有情况下,矢量 api 代码都比带有展开的简单乘法代码慢得多。
java - 如何在不复制数据的情况下将 IntBuffer 转换为 ByteBuffer
我的 Scala/Java 代码有一个大型(数百兆字节)整数数组。我会int[]
使用java.nio
. nio
此外,当我在我的套接字通道上收到任何数据时,我会使用这些数据int[]
而不进行复制。
所有nio
操作都需要ByteBuffer
,而ByteBuffer
只能换行byte []
。
我可以分配一个ByteBuffer
,然后将我的数组使用asIntBuffer
,但它会复制随机数组,我必须存储我的数据两次。
我正在使用项目巴拿马 openjdk,因此任何新技巧(如使用Pointer<>
)都可以帮助我。
TL;DR:在 Java 或 Scala 中,如何访问我的整数数组ByteBuffer
和int[]
.
java - 在 Rust 项目的 C 绑定上运行 jextract 时“找不到 cstdarg 文件”
我正在尝试使用 Rust 编写的简单整数加法函数与 Java 的 Project Panama 一起使用。使用 crate 生成绑定cbindgen
后,运行 jextract 时出现以下错误:
我已经查看了给出的示例,但无法破译我做错了什么。
这是我的库文件:
和生成的绑定(也需要源代码cstdint
,我猜?):cstdlib
new
我需要做什么jextract
才能找到这些文件?
java - 在 Rust 项目的 C 绑定上运行 jextract 时出现致命错误“'stdlib.h' 文件未找到”
我想使用 Project Panama 的jextract
工具来构建与 Rust 库的 Java 绑定。运行以下命令时,出现错误:
我很困惑,因为包含路径包含stdlib.h
:
错误行仅包含#include_next <stdlib.h>
.
我的 Rust 源代码是一个简单的函数:
标bindings.h
头由cbindgen
crate 生成:
我需要做什么jextract
才能找到stdlib.h
?
java - 如何使用 Java Panama FFI 访问 MemoryLayout 中的 C_POINTER
使用 JDK 16 中的 FFI 预览,我有这样的内存布局:
然后,我在本机代码的回调中收到指向此类结构的指针:
在 JDK 代码中引发异常jdk.internal.foreign.Utils
:
根据巴拿马文档, a 的 Java 载体C_POINTER
应该是MemoryAddress
,但这在这里不起作用。
那么使用 long 来访问此类指针是否正确?或者是其他东西?
java - 如何使用 Java Panama 在本机内存中存储对象数组
我想使用 Project Panama 的外部内存访问 API 在本机内存中实现数据结构。
为了做到这一点,我需要一个底层对象数组 ( Object[]
) 用于条目。
在外部内存访问 API 的所有示例中,MemorySegments 仅用于存储和检索原语,如下所示:
有没有办法将非基元存储在 MemorySegment(例如对象)中?如果是这种情况,当 VarHandles 仅支持原始载体时,如何使用 VarHandle 取消引用该 MemorySegment?