问题标签 [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 - 在本机内存中存储多个字节数组
我有固定数量的byte[]
固定长度的字节数组 ( ),我想将它们存储在本机内存中(然后再检索)。但是,我不太确定如何将多个数组直接存储在 MemorySegment 中。
我知道我可能会创建一个大的 MemorySegment 并逐个元素地对其进行初始化,但我认为这种策略会很慢并且会使检索更加麻烦(也许?)。
在 API 文档中,我遇到了 SegmentAllocator 抽象,这似乎解决了我的分配问题,但我不明白如何使用此 SegmentAllocator 检索分配的数据。
有没有办法访问 SegmentAllocator 中的数据,或者是否有不同的方法来解决我的问题?
java - 使用Java Vector API Shuffle复制_mm256_shuffle_epi8 Intrinsic?
我(主要是为了好玩)尝试使用 Java 的 Vector API 编写一个 SHA-256 摘要函数。我使用比特币的以下 AVX2 实现作为参考:
我已经能够做到使用 shuffle 内在函数的地步:return _mm256_shuffle_epi8(ret, _mm256_set_epi32(0x0C0D0E0FUL, 0x08090A0BUL, 0x04050607UL, 0x00010203UL, 0x0C0D0E0FUL, 0x08090A0BUL, 0x04050607UL, 0x00010203UL));
.
我看到 Java Vector API 提供了一个VectorShuffle
类和该类的rearrange
方法,Vector
但 API 文档似乎从索引的角度而不是掩码的角度接近洗牌。
_mm256_shuffle_epi8
所以我的问题是 - 如何使用 Java 的矢量 API复制(尽可能接近)内在函数的行为?
更新:我刚刚意识到 AVX2 SHA-256 比特币实现似乎是双 SHA-256 实现。这让事情变得复杂...
java - 巴拿马:填充并不能防止虚假分享
我正在尝试对错误共享对程序性能的影响进行基准测试。
在此示例中:https ://github.com/lexburner/JMH-samples/blob/master/src/main/java/org/openjdk/jmh/samples/JMHSample_22_FalseSharing.java ,缓存行填充导致性能提高数量级。
但是,当我使用 project panamas Foreign Memory Access API 时,缓存行填充实际上会使性能稍微变差。MemorySegments 是否隐式使用填充?还有什么可能导致这种行为?
我已经尝试在不同的硬件上运行基准测试并以相同的结果关闭超线程。
基准详细信息:
java - 如何使用 JEP 412 从 Java 17 调用 C 函数:外部函数和内存 API
有没有人有一个关于如何从 Java 17 调用 C 函数的简单示例,包括创建 C 库以及如何设置 MethodHandle?
https://openjdk.java.net/jeps/412上的 JEP 描述确实有一个示例,但我一直在努力理解它。
我认为可以使用 Project Panama ( https://jdk.java.net/panama/ ) jextract 来实现,但由于此功能包含在 JDK 中,我不想使用 Panama。
java - JEP 412:将堆上字节数组传递给本机代码,得到 UnsupportedOperationException: Not a native address
所有这些都与新的 JDK 17 相关。
我正在尝试将堆上字节数组转换为 MemorySegment 并将其传递给本机函数。我创建了简单的示例代码来显示这一点:
它试图运行但它抛出:
如果不是使用MemorySegment.ofArray(ba)
,我使用这个:
它有效并给出了预期的答案(5)。
我查看了这个函数MemoryAddressImpl.java
,我可以看到:
显然segment.base()
是返回null。
我真的不明白发生了什么事。我认为 Project Panama 的主要优势之一是本机代码可以访问堆内存,以避免复制。我当然可以做一个allocateNative()
然后将字节数组复制到其中,但这是我认为应该避免的副本。
对此有什么想法吗?我做错了什么或误解了如何使用堆内存?
java - 从 Java MemorySegment 高效读取的模式
我正在使用 Java 从(可能)大文件中读取(可能)大量数据 - 该场景是来自 HEIF 等文件格式的未压缩图像。可能大于 2G。写作是未来的需要,但这个问题仅限于阅读。
HEIF 格式(源自 ISO 基础媒体文件格式 - ISO/IEC 14496-12)是可变大小的“盒子”——您读取盒子的长度和种类,然后对盒子进行一些适当的解析。在我的设计中,我将解析出小的盒子,并保留对大容量存储 ( mdat
) 偏移的引用,以便能够根据要求提取数据以进行渲染/处理。
我正在考虑两个选项 - 多个 MappedByteBuffer(因为这是 2G 限制)和一个MemorySegment(来自内存映射文件)。我不清楚哪个可能更有效。MappedByteBuffer 拥有所有不错的 ByteBuffer API,但我需要管理多个实体。MemorySegment 将是一个条目,但看起来我需要创建切片视图来获取我可以从中读取的任何内容(例如字节数组或 ByteBuffer),这看起来像是同一问题的不同版本。MemorySegment 的第二个好处是,当我需要使用其他一些非 Java API(例如将图像输入硬件编码器进行压缩)时,它可能会带来更好的设计。我还实现并读取了 MemorySegment 的骨架(只是有一些粗略的假设,我可以将它变成单个 ByteBuffer)。
是否存在从 MemorySegment 高效读取的新兴模式?如果做不到这一点,我在 MemorySegment API 中是否缺少一些东西?
java - 如何通过java外部内存api传递值指针
我想在 C 中调用以下方法(在此处定义):
我遇到的问题是我无法通过 C-API 访问 struct heif_image_handle
。它被定义为没有定义的结构:
我试过的:
有人可以帮我如何在巴拿马 API 中使用这种方法。我的实际解决方法是扩展 C-API,但原作者不想这样做。
java - Eclipse Content Assist 不建议使用 jdk.* 类
我将我的项目配置为使用 Project Panama EA JDK,我可以手动使用 jdk.incubator.foreign.*,但 Content Assist 和 Quick Fix 不建议/修复此包中的任何内容。
有没有办法配置 Content Assist 之类的?
(我查看了 Preferences->Java->Editor->Content Assist,没有运气)
java - Java、巴拿马项目以及如何处理 Hunspell 的“建议”结果
我正在试验Hunspell以及如何使用Java Project Panama(Build 19-panama+1-13 (2022/1/18))与之交互。我能够完成一些初始测试,例如创建 ahandle to Hunspell
并随后使用它来执行拼写检查。我现在正在尝试更详细的方法,让 Hunspell 给我suggestions
一个字典中没有的单词。这是我现在拥有的代码:
我所看到的是对Hunspell_suggest
(created from jextract
) 的调用成功并给了我 (4) 建议(我在命令行中使用 Hunspell 进行了验证) - 所以那里没有问题。
现在对我来说更具挑战性的是如何解开suggestions
从这个调用返回的元素?我一直在查看各种示例,但似乎没有一个涉及这种详细程度(即使我找到示例,它们似乎使用的是过时的巴拿马 API)。
所以本质上,这是我的问题:
我如何使用巴拿马 JDK19 API 将一个据称由指向字符串数组的指针组成的结构解压缩到它们各自的字符串集合?