2015-09-04 67 views
7

我在实验室工作,编写多线程计算程序,在C++ 11上使用std::thread。现在我有机会在多CPU服务器上运行我的程序。如何利用C++中的多CPU?

服务器:

  • 运行Ubuntu的服务器
  • 有40个英特尔CPU的

我一无所知多CPU的编程。第一个想法,我想到运行40个应用程序,然后将他们的结果粘合在一起。这是可能的,但我想更多地了解我的机会。

  1. 如果我通过它的gcc编译器在服务器上编译我的代码,那么结果应用程序会利用多CPU吗?
  2. 如果#1答案取决于,我该如何检查它?

谢谢!

+1

如果您的程序已经有多个线程,那么操作系统会自动在不同的CPU上安排这些线程。你将受到线程数量的限制。如果您创建10个线程,那么您的程序将被限制为最多10个CPU。 –

+1

如果每个“结果”完全独立于其他所有其他应用程序,我实际上会编写一个单独的线程应用程序,然后通过'parallel'执行它(请参阅'sudo apt-get install parallel; man parallel') – v010dya

+0

要求非现场资源不在SO上。我已经删除了关于图书馆和其他资源的子问题,因为问题的其余部分是可回收的。 – Puppy

回答

0

你的问题不仅是关于多线程,而是关于多CPU。

  1. 基本上操作系统会自动将线程分散到核上。你不需要做任何事情。

  2. 一旦您使用C++ 11,您可以调用std::thread::get_id(),并确定不同的线程,但无法识别您正在使用的核心。直接使用pthreads +“cpu亲和力”。

你可以谷歌的“CPU亲和力”获得更多关于如何控制它的细节。如果你想要这种精度。您可以识别核心以及选择核心...您可以从此开始:http://man7.org/linux/man-pages/man3/pthread_setaffinity_np.3.html

+3

这个答案似乎与这个问题无关。提问者对核心或线程关联没有明显的需求,这基本上是你所讨论的。 – Puppy

+0

啊,小狗打败了我。 OP在询问如何多线程,而不是如何将线程绑定到内核。在大多数面向吞吐量的应用程序中,您不关心线程在哪里运行。 – Mysticial

+0

他不仅询问多线程,而且询问多CPU。这是一个不同的小球......他想检查它。这意味着他需要一个较低级别的代码来检查多CPU。 –

5

如果您的程序运行多线程,则操作系统应自动处理它使用可用的CPU。

确保将您必须做的工作分配给大约相同数量的线程,您可以使用CPU。确保它不仅仅是一个工作线程,其他线程只是等待这个线程的终止。