gpt4 book ai didi

java - 使用 native 接口(interface)的多个 java 线程与多线程 native 的单个 java 线程

转载 作者:太空宇宙 更新时间:2023-11-04 08:54:57 24 4
gpt4 key购买 nike

我正在准备一个使用 JNI 来加速物理建模计算的项目。 native 部分对一组数组进行计算,每个数组具有超过 1000 万个元素。

问题:哪个选项更适合性能:

1) 在 Java 中使用 8 个线程,每个线程通过本地调用 (jni-->c++) 处理数组的 1/8 部分。我是否需要将整个数组裁剪成更小的数组以防止不必要的数组复制?

2) 在调用 8 线程(pthreads?)的 native 的 java 中使用单线程我可以使用指针算法来仅选择在线程中使用的必要部分吗?

我需要处理单个数组拷贝(或原始数组),C++ 线程是否会为自己复制整个数组? java线程呢?哪个不抄袭,我就用那个。

注意:我正在使用 GetPrimitiveArrayCritical() 来防止 JNI 接口(interface)的数组复制(处理原始数组)。计算时间足够长,可以忽略 JNI 开销。

GetPrimitiveArrayCritical() 固定 java 数组,因此 GC 停止工作,直到 native 函数释放它,这会影响其他 java 线程的可访问性吗?

如果它很重要,实际上所有内容都在 extern "C"

操作系统:64位windows7中央处理器:fx8150虚拟机:64 位海湾合作委员会:64 位

谢谢。

最佳答案

从设计的角度来看,我更喜欢方法 #1,因为这意味着您不必在 JNI 代码中管理线程。这遵循“单一职责原则”:您的 native 代码只需要在您的算法更改时更改。我还认为 Java 提供的设施(线程池和 future )比直接线程更易于使用。

但是,如果您这样做,您应该特别注意 warning关于从多个线程固定和取消固定数组。

IMO 更好的方法是分配一个直接 ByteBuffer,并使用GetDirectBufferAddress 从JNI 访问它。 .这将使您可以使用 Java 端线程池来管理工作,并消除任何 native 端对缓冲区拷贝的担忧。

关于java - 使用 native 接口(interface)的多个 java 线程与多线程 native 的单个 java 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17677476/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com