为什么一个4线程程序在一个1核的虚拟机上运行要比在一个4核的虚拟机上运行快? 我使用一个4核(8个逻辑核)的i7CPU,一个DebianLinux 虚拟机也是DebianLinux 该程序使用gcc编译,无需特殊优化(默认编译设置) 我循环了1000次程序。当虚拟机有4个内核时,所需的时间将延长2倍以上。为什么?

为什么一个4线程程序在一个1核的虚拟机上运行要比在一个4核的虚拟机上运行快? 我使用一个4核(8个逻辑核)的i7CPU,一个DebianLinux 虚拟机也是DebianLinux 该程序使用gcc编译,无需特殊优化(默认编译设置) 我循环了1000次程序。当虚拟机有4个内核时,所需的时间将延长2倍以上。为什么?,c,multithreading,time,parallel-processing,pthreads,C,Multithreading,Time,Parallel Processing,Pthreads,注意:我运行的程序是一个C程序,生成4个线程(pthread)并在稍微计算后加入它们。它执行并行(而不是并发) 在I7中,所有内核共享三级缓存。如果额外的执行行在三级缓存上导致更多缓存未命中,则可能通过添加内核来降低速度。有些问题是令人尴尬的并行问题;有些是“令人尴尬的连载”。您可能已经找到了后者,但如果不使用代码,我们只能猜测 BigLock解决方案,例如树,只能通过锁定整个结构来更新的列表,不能从多个CPU中获益。更糟糕的是,多个CPU可能会导致锁周围的一系列抖动,而这些抖动将一无所获。可能

注意:我运行的程序是一个C程序,生成4个线程(pthread)并在稍微计算后加入它们。它执行并行(而不是并发)

在I7中,所有内核共享三级缓存。如果额外的执行行在三级缓存上导致更多缓存未命中,则可能通过添加内核来降低速度。

有些问题是令人尴尬的并行问题;有些是“令人尴尬的连载”。您可能已经找到了后者,但如果不使用代码,我们只能猜测


BigLock解决方案,例如树,只能通过锁定整个结构来更新的列表,不能从多个CPU中获益。更糟糕的是,多个CPU可能会导致锁周围的一系列抖动,而这些抖动将一无所获。

可能是错误共享,也可能是其他原因。看不到源代码就很难知道。嗯,是的,或者如果一级缓存从一个内核传输到另一个内核需要很长时间,那么在另一个内核中复制内存的时间已经比计算线程本身的任务或其他任务要长?这听起来是对的。没有人可能对你的计划有丝毫的了解。您提供的有用信息几乎为零。我们需要源代码、有关VM设置、度量和度量方法的完整详细信息。关于为什么程序通常可以或不能按预期工作的讨论太广泛了。不幸的是,我不能分享这段代码。你可以把它看作一个简单的映射。