使用直接内存访问的Java矩阵库

使用直接内存访问的Java矩阵库,java,blas,Java,Blas,是否有任何Java/Scala矩阵库包装blas/lapack并使用直接内存访问(ByteBuffers或不安全的.getFloat访问)?这种方法似乎可以避免跨越JNI边界时发生的所有数组复制 我不知道有任何这样的库,除了一些基于不安全的序列化框架,比如kryo;但我怀疑你是否需要它。根据我的经验,这不会成为您系统的瓶颈 出于正常的序列化和消息传递目的,您总是将矩阵序列化到字节缓冲区中,这就是可能发生不安全访问的地方。即使将Java内存复制到不安全的内存中,您也可以安全地实现非常高的消息吞吐量

是否有任何Java/Scala矩阵库包装blas/lapack并使用直接内存访问(ByteBuffers或不安全的.getFloat访问)?这种方法似乎可以避免跨越JNI边界时发生的所有数组复制

我不知道有任何这样的库,除了一些基于不安全的序列化框架,比如kryo;但我怀疑你是否需要它。根据我的经验,这不会成为您系统的瓶颈

出于正常的序列化和消息传递目的,您总是将矩阵序列化到字节缓冲区中,这就是可能发生不安全访问的地方。即使将Java内存复制到不安全的内存中,您也可以安全地实现非常高的消息吞吐量和非常低的延迟,可以轻松地将其转换为千兆字节吞吐量和微秒延迟

对于计算的目的,你不太可能经常改变大矩阵,而且每次你都会把它重新输入到C++计算层。这样的大矩阵通常是相关的或稀疏的,更新矩阵本身需要比将其馈送到C++侧更长的时间。
唯一的用途可能是当您试图实现一个端到端延迟约1微秒的系统时;但是如果这是你的目的,你可能不应该从java或者C++开始。

实际上,大多数java库都使用直接内存访问,通过<代码> GET*GISEXION/CONDE> JNI调用。代码>netlib java执行此操作。然而,这实际上是一个坏主意,因为它可以锁定垃圾收集器