问题标签 [numa]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1312 浏览

c - 如何强制两个进程在同一个 CPU 上运行?

语境:

我正在编写一个由多个进程组成的软件系统。它是在 Linux 下用 C++ 编程的。它们之间使用 Linux 共享内存进行通信。

通常,在软件开发中,进行性能优化是在最后阶段。在这里,我遇到了一个大问题。该软件对性能要求很高,但在4核或8核(通常多于一个CPU)的机器上,只能使用3核,浪费了25%的CPU功率,超过第二个占60%。经过多次研究,并放弃了互斥锁和锁争用,我发现时间被浪费在了 shmdt/shmat 调用上(分离并附加到共享内存段)。经过一番研究,我发现这些 CPU,通常是 AMD Opteron 和 Intel Xeon,使用一种称为 NUMA 的内存系统,这基本上意味着每个处理器都有其快速的“本地内存”,而从其他 CPU 访问内存是昂贵的。

在做了一些测试之后,问题似乎在于软件的设计使得基本上任何进程都可以将共享内存段传递给任何其他进程以及其中的任何线程。这似乎会降低性能,因为进程不断地从其他进程访问内存。

问题:

现在,问题是,有没有办法强制成对的进程在同一个 CPU 中执行?我并不是要强迫它们总是在同一个处理器中执行,因为我不在乎它们在哪个处理器中执行,尽管这样可以完成这项工作。理想情况下,有一种方法可以告诉内核:如果你在一个处理器中调度这个进程,你还必须在同一个处理器中调度这个“兄弟”进程(它是通过共享内存与之通信的进程),这样表现不受处罚。

0 投票
1 回答
2250 浏览

linux - 如何为大型软件运行更好地配置 linux/CPU (NUMA)

我正在为内存驱动的大型程序(数十 GB 内存)在 linux 上进行性能分析。

我在想是否可以将 linux/硬件配置为更适合运行此类大型程序。但我对这一面并不熟悉。

任何人都有关于如何配置的观点

  1. 操作系统的内存分配策略
  2. CPU的缓存配置
  3. 别的...

任何评论表示赞赏..

这是典型的 CPU 模型(4 个 Opteron 处理器,每个处理器都有双核):

0 投票
2 回答
1990 浏览

c - malloc/memcpy 函数在 NUMA 上独立运行吗?

在尝试提高我在非 NUMA/标准 PC 上的应用程序的速度时,我总是发现瓶颈是调用,malloc()因为即使在多核机器中,它也是在所有内核之间共享/同步的。

我有一台使用 Linux 和 C 的具有 NUMA 架构的 PC,我有两个问题:

  1. 在 NUMA 机器中,由于每个内核都有自己的内存,是否会malloc()在每个内核/内存上独立执行而不会阻塞其他内核?
  2. 在这些架构中,如何调用memcpy()?可以在每个核心上独立调用它,还是在一个核心中调用它会阻塞其他核心?我可能错了,但我记得也memcpy()有同样的问题,malloc()即当一个核心使用它时,其他核心必须等待。
0 投票
3 回答
2572 浏览

performance - 基准处理器亲和力影响

我正在研究一个NUMA架构,其中每个计算节点有 2 个套接字和 4 个内核,计算节点总共有 8 个内核,每个节点有 24GB 的 RAM。我必须证明设置处理器亲和性会对性能产生重大影响。

您是否有任何程序建议我可以用作基准来显示使用处理器亲和性之间的影响差异?我也可以使用 MPI、OpenMP 或 pthreads 编写一个简单的 C 测试程序,但是什么操作最适合进行该测试?它必须能够利用缓存局部性,但也会触发上下文切换(阻塞操作),因此进程可能会迁移到另一个核心,或者更糟的是,迁移到另一个套接字。它必须在 8 个内核的倍数上运行。

0 投票
1 回答
2487 浏览

x86-64 - x86-64 处理器的 NUMA 文档?

我已经查找了 X86-64 处理器的 NUMA 文档,不幸的是我只找到了 NUMA 的优化文档。

我想要的是:如何在系统中初始化 NUMA(这将包括获取系统的内存拓扑和处理器拓扑)。有谁知道关于 X86-64 AMD 和 Intel 处理器的 NUMA 的好文档?

0 投票
3 回答
894 浏览

c++ - realloc() 用于使用 HWLOC 的 NUMA 系统

我有几个自定义分配器,它们提供了基于不同策略分配内存的不同方法。其中之一在定义的 NUMA 节点上分配内存。分配器的接口很简单

分配本身是使用hwloc_alloc_membind_nodeset()具有为分配策略等设置的相应参数的方法处理的。但是,hwloc 仅提供分配和释放内存的方法,我想知道我应该如何实现reallocate()

两种可能的解决方案:

  1. 分配新的内存区域和memcpy()数据
  2. 用于hwloc_set_membind_nodeset()设置节点集的内存分配/绑定策略,使用普通malloc()/posix_memalign()realloc().

任何人都可以帮助我解决这个问题吗?

更新:

我试图使问题更具体:是否有可能在不分配新内存和移动页面的情况下执行realloc()使用?hwloc

0 投票
1 回答
395 浏览

language-agnostic - 如何使程序 NUMA 准备好?

我的程序使用共享内存作为数据存储。该数据必须可供任何正在运行的应用程序使用,并且必须快速获取该数据。但有些应用程序可以在不同的 NUMA 节点上运行,它们的数据访问成本非常高。每个 NUMA 节点的数据复制是唯一的方法吗?

0 投票
3 回答
1823 浏览

multithreading - 如何计算对远程 NUMA 内存节点的内存访问?

在最近的 linux 分布式共享内存系统上运行的多线程应用程序中,是否有直接的方法来计算每个线程对远程(非本地)NUMA 内存节点的请求数?

我正在考虑使用 PAPI 来计算互连流量。这是要走的路吗?

在我的应用程序中,线程在其整个生命周期内都绑定到特定的内核或处理器。当应用程序开始时,内存是按页分配的,并以循环方式分布在所有可用的 NUMA 内存节点上。

谢谢您的回答。

0 投票
6 回答
11080 浏览

c++ - 测量 NUMA(非统一内存访问)。没有可观察到的不对称性。为什么?

我试图测量 NUMA 的非对称内存访问效果,但失败了。

本实验

在 Intel Xeon X5570 @ 2.93GHz、2 个 CPU、8 个内核上执行。

在固定到核心 0 的线程上,我使用 numa_alloc_local 在核心 0 的 NUMA 节点上分配大小为 10,000,000 字节的数组x。然后我遍历数组x 50 次并读取和写入数组中的每个字节。测量执行 50 次迭代所用的时间。

然后,在我的服务器中的每个其他内核上,我固定一个新线程并再次测量经过的时间,以对数组x中的每个字节进行 50 次读取和写入迭代。

数组x很大以最小化缓存效应。我们想要测量 CPU 必须一直到 RAM 进行加载和存储时的速度,而不是在缓存有帮助的时候。

我的服务器中有两个 NUMA 节点,因此我希望在分配数组x的同一节点上具有亲和力的内核具有更快的读/写速度。我没有看到。

为什么?

正如我在其他地方看到的那样,也许 NUMA 只与具有 > 8-12 个内核的系统相关?

http://lse.sourceforge.net/numa/faq/

numatest.cpp

输出

对数组x进行50 次迭代读取和写入大约需要 1.7 秒,无论哪个内核正在执行读取和写入。

更新:

我的 CPU 上的缓存大小为 8Mb,因此 10Mb 数组x可能不足以消除缓存效果。我尝试了 100Mb 数组x,并尝试在最里面的循环中使用 __sync_synchronize() 发出完整的内存围栏。它仍然没有显示 NUMA 节点之间的任何不对称性。

更新 2:

我尝试使用 __sync_fetch_and_add()读取和写入数组x 。依然没有。

0 投票
2 回答
1006 浏览

c - 在驻留在不同套接字上的处理器之间共享数据的最快方法

我有一个双插槽 8 核处理器,即每个处理器都有 4 核。我还没有完全看到它的规范,但我认为一个单独的内存库以 ccNUMA 方式连接到每个处理器,因此从另一个处理器的内存库访问相对较慢。我想他们也有不同的 L3 缓存。

现在我的问题是在两个处理器之间共享数据的最快方法是什么。由于 ccNUMA 和缓存一致性,简单的共享内存会出现问题。有什么方法非常快吗?