Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading c++;异步:与8核相比,4核更快_Multithreading_C++11_Asynchronous_Cpu Cores - Fatal编程技术网

Multithreading c++;异步:与8核相比,4核更快

Multithreading c++;异步:与8核相比,4核更快,multithreading,c++11,asynchronous,cpu-cores,Multithreading,C++11,Asynchronous,Cpu Cores,我有16000份工作要做 每项工作都是独立的。没有共享内存,没有进程间通信,没有锁或互斥 我在ubuntu 16.06上。c++11。英特尔®核心™ i7-8550U CPU@1.80GHz×8 我使用std::async在内核之间分割作业 如果我将作业分成8个(每个核2000个),计算时间是145。 如果我将作业分成4个(每个核4000个),计算时间是60 在这两种情况下,reduce之后的输出是相同的 如果我在计算过程中监控CPU(仅使用htop),事情就会如预期的那样发生(第一种情况下10

我有16000份工作要做

每项工作都是独立的。没有共享内存,没有进程间通信,没有锁或互斥

我在ubuntu 16.06上。c++11。英特尔®核心™ i7-8550U CPU@1.80GHz×8

我使用std::async在内核之间分割作业

如果我将作业分成8个(每个核2000个),计算时间是145。 如果我将作业分成4个(每个核4000个),计算时间是60

在这两种情况下,reduce之后的输出是相同的

如果我在计算过程中监控CPU(仅使用htop),事情就会如预期的那样发生(第一种情况下100%使用8个核,第二种情况下100%使用4个核)

我很困惑为什么4个核的处理速度比8个快得多。

有4个核和8个线程

有什么区别?引述:

“超线程”是英特尔第一次尝试实现并行计算 它首次在台式CPU上使用 奔腾4 HT早在2002年。今天的奔腾4只提供了一个 单CPU核心,因此一次只能执行一项任务 时间,即使它能够足够快地在任务之间切换 这看起来像是多任务处理。超线程试图弥补 那个

带有超线程的单个物理CPU内核显示为两个逻辑CPU内核 将CPU连接到操作系统。CPU仍然是单个CPU,因此它是一个 有点作弊。而操作系统看到两个CPU 每个核心,实际的CPU硬件只有一组执行 每个核心的资源。CPU假装拥有比它更多的内核 它使用自己的逻辑来加速程序的执行。在里面 换言之,操作系统被骗看到两个CPU 每个实际的CPU核心

超线程允许两个逻辑CPU内核共享物理内存 执行资源。如果一个虚拟的 CPU被暂停并等待,另一个虚拟CPU可以借用它的 执行资源。超线程有助于加快系统速度, 但它远没有实际的额外内核好


如果将作业拆分为比可用核数更多的核,您将付出巨大的代价。

我们也没有看到任何代码。您没有8个核,CPU是四核的。好吧,您做错了。出错的一种方法是等待最慢的线程完成。相反,将计算任务分解为更小的数据包,以便可以在下一个线程准备就绪的任何线程上处理这些数据包。看看标准生产者消费者算法。我确信:“超线程可以帮助加快系统的速度,但它远不如实际添加的内核那么好。”应该用“,,,和你自己的C++代码来扩展,它实际上会使事情变慢”(或者这取决于这个代码是如何构造的)。我们必须对CPU进行只读配置,而不是相信操作系统。如果每个软件线程都需要100%的处理器时间(无需等待),那么最佳线程数等于内核数。否则,最佳线程数可能会高得多。您应该查询操作系统的内核数,而不是逻辑处理器数。