我为4个套接字服务器的大型对象(双精度矩阵)编写了NUMA感知缓存。我观察到套接字间通信是我的应用程序的瓶颈。因此,我希望不同套接字上的线程具有单独的矩阵缓存。我已将线程绑定到特定的物理处理器,现在我需要使线程选择正确的缓存。
假设以以下方式定义缓存:
matrix_cache_t *cache[SOCKETS_LIMIT];
我需要每个线程以了解它的插座ID,然后选择正确的缓存,例如cache[0]
,cache[1]
,cache[2]
或cache[3]
。
我正在使用OpenMP用C编写应用程序,并且该应用程序应该可以在Windows和Linux上运行。
在Windows下,您可以GetLogicalProcessorInformationEx()
通过RelationNumaNode
或RelationProcessorPackage
关系使用API 。它为您提供了各个关系中所有处理器的位,这些位与用于将线程绑定到处理器的亲和力位相对应。
在Linux下,您可以使用 sched_getcpu
#include <stdio.h>
#include <sched.h>
int sched_getcpu();
int main()
{
(void) printf("cpu %d\n", sched_getcpu());
}
套接字ID可以在/proc/cpuinfo
或中找到/sys/devices/system/cpu/cpu0/topology/physical_package_id
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句