我正在编写一个c ++库,该库将被另一个(第三方)应用程序读取为DLL。
我想将库的线程池中的线程的相似性设置为与应用程序主线程相同的NUMA节点。这样,所有线程都在同一个NUMA节点中运行,并且我在所有线程中获得了最有效的内存访问/分配。
我当前的过程如下:获取运行主线程的NUMA节点,找到该节点内的所有内核,然后设置线程池线程对那些内核的亲和力。
主要问题是应用程序的主线程是否可以随意在NUMA节点之间切换...如果主线程可以更改哪个节点,那么我的线程的NUMA亲和力与主线程的NUMA节点匹配就没有意义了。稍后。
为了确保不发生节点跳跃,整个应用程序是否必须限制其NUMA关联性?还是可以保证线程坚持使用最初生成的任何NUMA节点?我知道OS调度程序会导致线程可以在内核之间跳转,但是我找不到关于线程是否可以在NUMA节点之间跳转的任何信息...