我正在编写一个使用大量CPU和内存使用量的多线程Java程序。
该程序的目标是在图形上执行某种算法。该程序在运行Linux的NUMA计算机上执行,我想获得最佳性能。
为此,我为每个NUMA节点制作了许多图副本,以便每个线程都能够访问本地内存上的图。
局部内存分配的一部分已经通过在分配图的每个新副本之前设置亲和力来完成。这是用jna完成的,所以我更愿意留在这个库中,如果可能的话,不要添加jni代码。
我的问题是如何检查工作线程在哪个内核上运行以便从本地内存中进行读取?
我知道线程到核心的绑定(bind)在执行过程中可能会发生变化。但是,内核会尝试在所有时间片上在同一NUMA节点上运行线程。因此,在大多数情况下,仅在开始时检查线程在哪个内核上运行即可。
最佳答案
事实证明,有一种方法可以通过jna调用以获取所需的信息。
方法名称是:sched_getcpu
。完整的代码段如下所示
public interface CLibrary extends Library{
public static final CLibrary INSTANCE =
(CLibrary) Native.loadLibrary("c", CLibrary.class);
public int sched_getcpu() throws LastErrorException;
}
现在,当你做
CLibrary.INSTANCE.sched_getcpu();
您将获得当前线程在其中运行的核心ID。