c - 确定运行线程的套接字/处理器

标签 c multithreading openmp numa

我为 4 套接字服务器的大对象( double 矩阵)编写 NUMA-aaware 缓存。我观察到套接字间通信是我的应用程序的瓶颈。因此,我希望不同套接字上的线程具有单独的矩阵缓存。我已将线程限制到特定的物理处理器,现在我需要让线程选择正确的缓存。

假设缓存定义如下:

matrix_cache_t *cache[SOCKETS_LIMIT];

我需要每个线程知道它的套接字 ID 并选择正确的缓存,例如cache[0] , cache[1] , cache[2]cache[3] .

我正在使用 OpenMP 用 C 语言编写应用程序,它应该可以在 Windows 和 Linux 上运行。

最佳答案

在 Windows 下,您可以使用 GetLogicalProcessorInformationEx()使用 RelationNumaNodeRelationProcessorPackage 关系的 API。它为您提供相应关系中所有处理器的位,这些位对应于用于将线程绑定(bind)到处理器的关联位。

在 Linux 下你可以使用 sched_getcpu

#include <stdio.h>
#include <sched.h>

int sched_getcpu();

int main()
{
    (void) printf("cpu %d\n", sched_getcpu());
}

Socket id可以在/proc/cpuinfo/sys/devices/system/cpu/cpu0/topology/physical_package_id中找到

关于c - 确定运行线程的套接字/处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25372961/

相关文章:

java - 多线程服务器共享ArrayList

c++ - 我是否正在使用OpenMP干扰其他程序?

openmp - 使用 openmp 并行化代码 sse 内在函数 c

java - 通知给出 IllegalMonitorStateException

c# - C#中的异步操作和线程

openmp - omp_set_dynamic - 运行时如何确定线程数?

c - 如何打印 stat 函数返回的日期和时间

c - 通过中断保护读取值

c - 双向链表C,在特定位置插入

C - 以不同排列打印星形图案