java - 高效使用 NUMA 架构

标签 java multithreading memory-management numa

我正在编写一个使用大量 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。

关于java - 高效使用 NUMA 架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23795071/

相关文章:

java - weblogic集群中web应用程序之间的通信

java - 为什么异步线程不能同时修改 ArrayList?

multithreading - 马克西玛。线程本地存储耗尽

java - 水平黑莓菜单

java - 如何在Java字符串表达式中查找字符串模式?

iphone - iOS 应用程序崩溃偶尔崩溃 - 在屏幕显示或向下滚动时

security - 内存安全和保障 - 沙箱任意程序?

iphone - 我必须在 Instruments 应用程序和 ObjectAlloc 中查看哪些指标,才能确定我的应用程序中是否存在内存泄漏?

java - 在 JScrollPane 中滚动更顺畅

c# - 停止多线程 Windows 服务