代码之家  ›  专栏  ›  技术社区  ›  njvb

将特定线程绑定到特定处理器内核

  •  6
  • njvb  · 技术社区  · 14 年前

    我在大学里学过一点并行处理的知识,现在我正努力把它学得更好。我可以编写可以并行运行的代码,然后启动线程,但在那之后我就失去了对线程的控制。我想知道如何控制线程,例如将特定线程绑定到特定处理器核心。

    我主要对c++感兴趣,但我已经用Java编写了一些代码,所以这些答案也很受欢迎。

    3 回复  |  直到 14 年前
        1
  •  4
  •   BalusC    11 年前

    我从Java的角度回答:这是不可能的。你能控制的最好的就是 thread priority 过程 java.exe 设置关联 勾选CPU/核心。

    enter image description here

    正如您可能猜到的,这确实是全局设置了关联性,而不是基于您在Java中创建的线程。

        2
  •  15
  •   Barney Pitt    11 年前

    与其他一些受访者的建议相反,对于某些系统(当然是高频交易,无疑还有许多其他非常低延迟的系统,如搜索引擎),将线程绑定到CPU核心(或者对于超线程核心,单个CPU线程)可以带来巨大的性能优势。

    天真但越来越被拒绝的观点是,增加线程(在合理范围内)会增加此类系统的吞吐量。然而,越来越多的证据表明 如果设计得当 ,在大多数处理过程中使用很少线程的解决方案的性能可能会比高并发性解决方案有相当大的提高—有时是10倍,甚至100倍。

    其主要原因是语境转换。上下文切换是一个CPU为当前线程刷新其工作环境以缓存RAM(如果幸运的话)或主RAM(如果不幸运的话),并读取下一个线程的工作环境的过程—这是低延迟系统可以执行的最昂贵的操作之一。

    要在Java中以独立于操作系统的方式实现线程关联(CPU绑定)任务,您可以使用Peter Lawrey的Java线程关联库(也链接到下面)。还要注意一个例子,在这个例子中,Peter将一个reader线程绑定到一个超线程核心的一个超线程上,将一个writer线程绑定到另一个超线程上,我可以想象这个技巧会带来可观的好处(尽管我没有尝试过)。

    巴尼

    http://lmax-exchange.github.io/disruptor/

    https://github.com/peter-lawrey/Java-Thread-Affinity/wiki/How-it-works

        3
  •  4
  •   Reed Copsey    14 年前

    在Windows上,可以使用 SetThreadAffinityMask