gpt4 book ai didi

java - 带有 native 代码的多核 Java 程序

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:34:47 25 4
gpt4 key购买 nike

我在 Java 程序中使用 native C++ 库。 Java 程序是为使用多核系统而编写的,但它无法扩展:最好的速度是在 6 个内核左右,即添加更多内核会减慢速度。我的测试表明,对 native 代码的调用本身会导致问题,因此我想确保不同的线程访问 native 库的不同实例,从而消除并行任务之间的任何隐藏(内存)依赖性。换句话说,而不是静态 block

static {
System.loadLibrary("theNativeLib");
}

我想为每个线程动态加载库的多个实例。主要的问题是这是否可能。然后怎么做!

注意事项:- 我在 Java 7 fork/join 以及 Scala/akka 中都有实现。因此,感谢每个平台的任何帮助。- 并行任务是完全独立的。事实上,每个任务可能会创建几个新任务,然后终止;没有进一步的依赖!

下面是 fork/join 风格的测试程序,其中 processNatively 基本上是一堆本地调用:

class Repeater extends RecursiveTask<Long> {
final int n;
final processor mol;

public Repeater(final int m, final processor o) {
n=m;
mol = o;
}
@Override
protected Long compute() {
processNatively(mol);
final List<RecursiveTask<Long>> tasks = new ArrayList<>();
for (int i=n; i<9; i++) {
tasks.add(new Repeater(n+1,mol));
}

long count = 1;
for(final RecursiveTask<Long> task : invokeAll(tasks)) {
count += task.join();
}
return count;
}
}
private final static ForkJoinPool forkJoinPool = new ForkJoinPool();

public void repeat(processor mol)
{
final long middle = System.currentTimeMillis();
final long count = forkJoinPool.invoke(new Repeater(0, mol));
System.out.println("Count is "+count);
final long after = System.currentTimeMillis();
System.out.println("Time elapsed: "+(after-middle));
}

换句话说:如果我有 N 个使用 native 库的线程,如果它们中的每一个都调用 System.loadLibrary("theNativeLib"); 会发生什么?动态地,而不是在静态 block 中调用一次?他们会共享图书馆吗?如果是,我怎样才能欺骗 JVM 将其视为独立加载的 N 个不同的库? (N的值静态未知)

最佳答案

System.loadLibrary 的 javadoc 声明它与调用 Runtime.getRuntime().loadLibrary(name) 相同。此 loadLibrary ( http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#loadLibrary(java.lang.String) ) 的 javadoc 声明“如果使用相同的库名称多次调用此方法,则将忽略第二次和后续调用。”,所以看起来你可以'不要多次加载同一个库。关于让 JVM 认为存在多个实例,我帮不了你。

关于java - 带有 native 代码的多核 Java 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12038180/

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