【发布时间】:2014-07-10 19:07:50
【问题描述】:
我正在编写一个占用大量 CPU 和内存的多线程 Java 程序。 该程序的目标是在图上执行一些算法。该程序在运行 linux 的 NUMA 机器上执行,我希望获得最佳性能。
为此,我为每个 NUMA 节点制作了多个图形副本,以便每个线程都能够访问本地内存上的图形。
本地内存分配部分已经通过在分配图的每个新副本之前设置亲和性来完成。这是用 jna 完成的,所以如果可能的话,我更愿意继续使用这个库而不是添加 jni 代码。
我的问题是如何检查工作线程在哪个核心上运行,以便从本地内存中进行读取?
我了解线程到内核的绑定在执行期间可能会发生变化。但是,内核尝试在所有时间片上在同一个 NUMA 节点上运行线程。因此,在大多数情况下,仅在开始时检查线程运行在哪个内核上才有效。
【问题讨论】:
-
由于 NUMA 库的质量/支持不佳,即使在 C/C++ 中也很难做到这一点。
-
我不需要专门的 NUMA 库。只是想知道线程在哪个核心上运行。从 core-id 我可以毫无问题地知道 NUMA 节点。
-
我非常怀疑你可以用 Java 做到这一点。唯一真正的选择是 C++(我自己也是一名 Java 开发人员)。但对于 NUMA 架构及其上的并行处理,C++ 和 MPI 是唯一的选择。
-
Alexandros,您可能会惊讶于还有多少选择。 C、Python 和 Go 只是其他几种可以很好地利用 NUMA 系统的语言。它们中的每一个都有自己的同步和 IPC 选项,从 mmap 到管道到套接字到 SHMEM 和其他库,再到特定于语言的功能。如果您担心其中一些选项不包含用于确定您的 NUMA 拓扑的标准化功能,那可能是正确的,尽管
man 7 numa在 Linux 上有一些帮助。
标签: java multithreading memory-management numa