Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
Performance 最大CPU性能-堆叠所有任务或目标低于100%?_Performance_Cpu_Multitasking - Fatal编程技术网

Performance 最大CPU性能-堆叠所有任务或目标低于100%?

Performance 最大CPU性能-堆叠所有任务或目标低于100%?,performance,cpu,multitasking,Performance,Cpu,Multitasking,我有12个任务要在octo core机器上运行。所有的任务都是CPU密集型的,每个任务都将最大化一个核心 是否有理论上的原因可以避免将任务堆积在一个最大化的核心上(例如开销、任务之间的交换),或者对所有任务进行排队更快 任务切换是对CPU时间的浪费。尽量避免 无论调度程序时间片设置为什么,CPU都会将其时间片浪费在进入内核、保存所有寄存器、交换内存映射和启动下一个任务上。然后它必须加载所有的CPU缓存,等等 一次只运行一个任务效率更高 当然,如果任务使用I/O并且不是纯粹的计算限制,情况就不同了

我有12个任务要在octo core机器上运行。所有的任务都是CPU密集型的,每个任务都将最大化一个核心


是否有理论上的原因可以避免将任务堆积在一个最大化的核心上(例如开销、任务之间的交换),或者对所有任务进行排队更快

任务切换是对CPU时间的浪费。尽量避免

无论调度程序时间片设置为什么,CPU都会将其时间片浪费在进入内核、保存所有寄存器、交换内存映射和启动下一个任务上。然后它必须加载所有的CPU缓存,等等

一次只运行一个任务效率更高


当然,如果任务使用I/O并且不是纯粹的计算限制,情况就不同了。

是的,这叫做排队理论。对于一系列不同的问题,有许多不同的模型。我建议您扫描它们,选择最适合您的工作负载的模型,然后阅读如何避免该模型的最坏结果,或者选择一个不同的、更好的模型来分配您的工作负载

尽管此链接中的图表适用于流量,但它会让您了解随着CPU利用率的增加,响应时间会发生什么变化。这表明你会到达一个拐点,在这个拐点之后,事情会变得越来越慢

到达的工作比可以处理的更多,后续工作等待的时间越来越长,直到可以分派为止

你拥有的核越多,你越往右转,你就越能推动拐点,但当你到达拐点后,事情就越快变坏

我还要指出的是,除非你有一些真正认真的冷却,否则你将煮你的CPU。取决于它的设计,它要么会减慢速度,使你的问题更糟,要么你会触发它的热过载保护

因此,对于8个核心来说,一个简单的设计是,1个线程用于管理事务并将任务添加到工作队列,7个线程用于从工作队列中提取任务。如果任务需要在特定时间内执行,则可以添加TimeToLive值,以便丢弃它们,而不是不必要地执行它们。正如您几乎可以肯定的那样,在一个使用先发制人线程模型的OS中运行应用程序,在可能的情况下考虑使用处理器的亲和力,因为AS @ ZAN-LYX称任务/上下文切换是有害的。小心不要再次尝试构建操作系统的线程管理,因为您可能会与之发生冲突。

tl;博士:缓存抖动是不好的 你有一打任务。每个人都必须做一定量的工作

在应用程序级别,他们每个人都处理了1000条客户记录或其他任何东西。这是固定的,无论硬件上发生什么,它都是一个常数

在语言层面上,它又是固定的,C++、java或Python将执行固定数量的应用程序指令或字节码。我们将在这里忽略gc开销,以及页面错误和调度细节

在程序集级别,同样是固定的,当应用程序继续发出新指令时,将执行一些x86指令

但您不关心指令的数量,只关心执行这些指令所需的时间。许多指令是将值从RAM移动到寄存器的读取。想想这需要多长时间。您的计算机有几个组件来实现内存层次结构-将涉及哪些组件?读会在一级缓存中命中吗?在L2中?在最后一级缓存中是否会出现遗漏,所以您会等待(数十个或数百个周期),直到RAM交付该缓存线?虚拟内存引用是否在RAM中丢失,因此您等待(毫秒)直到SSD或Winchester存储可以在所需帧中分页?您认为您的应用程序发出N次读取,但您可能更有效地认为它发出0.2*N次缓存未命中。在不同的多编程级别上运行,即发出0.3*N缓存未命中,可能会显著延长运行时间


每个工作负载都是不同的,并且可能对内存存储提出更大或更小的要求。但内存层次结构的每一级在某种程度上都依赖于缓存,更高的多编程级别保证会影响缓存命中率。存在网络和I/O繁重的工作负载,其中非常高的多编程级别绝对有意义。但是对于CPU和内存密集型工作负载,当您对运行时间进行基准测试时,您可能会发现少即是多

您能澄清12项任务的含义吗?您的设计是否使用12个长时间运行的线程,或者您是否需要分派12种不同类型的功能。您使用的是什么操作系统?什么样的工作量?图形?为什么不试试变体,看看会发生什么。我正在并行化一个进程,该进程在文本数据库上执行SQL查询,并解析以不同语言和不同方式表示的日期。它被分成12个小程序,每个月一个。我可以发射其中一些,等待第一个发射终止,然后再发射另一个。我现在一次启动所有的程序。(没有硬件问题——CPU保持相当酷)取决于语言和操作系统,有些东西像“英特尔线程配置文件”(Intel Thread Profile)。如果不能在24小时内满负荷运行所有内核(包括AVX!),那么您的计算机就造错了。修理它的冷却系统。