如何在c ++中利用multi-cpu?

时间:2015-09-04 17:07:17

标签: c++ multithreading c++11 cpu cpu-usage

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

服务器:

  • 运行Ubuntu服务器
  • 拥有40个Intel CPU'

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

  1. 如果我通过它的gcc编译器在服务器上编译我的代码,生成的应用程序是否会利用多CPU?
  2. 如果#1答案取决于,我该如何检查?
  3. 谢谢!

2 个答案:

答案 0 :(得分:5)

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

确保将您必须完成的工作分配给可以使用的CPU的相同数量的线程。确保它不仅仅是一个执行工作的线程,而其他线程只是在等待此线程的终止。

答案 1 :(得分:0)

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

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

  2. 使用C ++ 11后,您可以调用enum memberTypes { None, Property, Method } class memberInfo { memberName: string; memberType: memberTypes; constructor(name: string, mtype: memberTypes) { this.memberName = name; this.memberType = mtype; } toString() { return JSON.stringify(this); } } class propertyInfo extends memberInfo { constructor(name: string) { super(name, memberTypes.Property); } } class methodInfo extends memberInfo { constructor(name: string) { super(name, memberTypes.Method); } } var dict = new Object(); var objectArray = new Array<memberInfo>(); objectArray.push(new propertyInfo("Name"), new methodInfo("toString")); objectArray.forEach((item) => { if (item.memberType === memberTypes.Property) { if (item.memberName === "Name") { dict[item.memberName] = 'SysName'; } } else if (item.memberType === memberTypes.Method) { if (item.memberName === "toString") { dict[item.memberName] = function() { return JSON.stringify(this); }; } } console.log(item.toString()); }) console.log(dict); 并识别不同的线程,但无法识别您正在使用的核心。直接使用std::thread::get_id() +“cpu affinity”。

  3. 您可以谷歌搜索“CPU亲和力”,了解有关如何控制它的更多详细信息。如果你想要这种精度。您可以识别核心以及选择核心...您可以从这开始:http://man7.org/linux/man-pages/man3/pthread_setaffinity_np.3.html