是否可以使单线程程序使用多个内核?


12

标题说明了一切:是否有办法使设计为使用单个CPU内核的较旧程序使用多个CPU内核?


13
不,不可能。
摩押

5
如果仅仅是那么简单..
布伦丹·朗

1
如果有一个程序“模拟”了一个处理器(例如vm?),但是却使用了多核CPU并模拟了单核CPU,而每个线程具有更多的处理能力,该怎么办?那可能吗?
schizoid04 '18年

然后,谁来管理多个线程之间的同步,因为顺序很重要。
user36582 '18 -10-30

Answers:


16

不幸的是,不能强迫为单个CPU编写的旧程序使用多个CPU内核。使用多个CPU内核需要多个线程,这些线程需要相互通信,同时确保不发生竞争状况和其他问题。除非经过重写才能使用旧的应用程序,否则不能使它使用超过CPU内核的功能,并且前提是应用程序的性质允许对其进行并行化。


19
还值得注意的是,某些应用程序根本无法重写以考虑到多个内核。这主要取决于该过程的可并行性。不可复制过程的一个简单例子是人类繁殖:一名妇女可以在9个月内生育一个孩子。9名妇女可以在9个月内生育9个孩子,但您不能在9个月内让9名妇女生育一个孩子。
AndrejaKo 2011年

1
原则上,可以编写一个程序来分析另一个程序并尝试对其进行并行化。就是说,即使是这个问题的非常有限的“简单”版本也都在产生博士学位。过去几代人的论文,进展缓慢。完整的问题很可能是AI完整的。
dmckee ---前主持人小猫,

太好了,谢谢大家,您让我对您的女士和出生示例感到满意,尤其是当您谈论制造业时:D
Chris

如果程序具有一堆相互独立的数学运算,该运算随后会相互使用怎么办?也许第二个线程可以解析程序,嗯,我不知道我在说什么。如果一个线程可以解析程序集..“在这里进行昂贵的操作,然后进行第二次昂贵的操作,使第一个昂贵的操作不会碰到”。回到主线程上。我认为必须预先准备整个程序,以识别独立的昂贵操作。
CauseingUnderflowsEverywhere'Sep

13

您的目标是什么?性能提高了吗?可悲的是,仅使用1个内核的应用程序将不会使用更多的内核。这就是所谓的“多线程”应用程序的全部含义。


2

在设计为使用单个内核的程序中,至少有三种技术可以利用多个处理器。这些技术中最直接的方法是使用使用多个内核或可以与应用程序代码至少部分并行执行的库和系统代码。垃圾回收是可以并行化的功能的一个示例,并且可能与应用程序执行并行进行。即使没有自动内存管理,内存释放功能中也可能存在并行性,因为内存分配器可能要做的工作不仅仅是简单地将内存部分标记为可用。

第二种技术是二进制翻译。尽管这可能被认为是“重写应用程序”,但是它是由软件完成的,并且无法访问源代码。使用二进制转换(大多数情况下涉及在不同的ISA上运行遗留代码,利用ISA扩展或针对特定的微体系结构进行优化以及使用动态信息来提供更高的性能),产生线程级并行性似乎并不是大多数研究和开发的主要目标。质量配置文件引导的优化),但潜力是显而易见的。

第三种技术是推测性多线程。目前,(据我所知)没有处理器支持硬件管理的推测性多线程。然而,随着硬件事务性存储器的引入,具有运行时系统的实现方式在某种程度上变得更加实用,因为HTM可用于检测内存使用中的冲突。软件管理的推测性多线程通常会涉及一些二进制转换,但是其推测性证明考虑单独的技术是合理的。

这些技术的实用性受到与现有系统相关的成本(包括线程之间和生成线程之间的通信成本),它们可以利用的有限并行性以及有限的投资回报(可能有益的重要应用程序)的限制。并行化很可能会被重写,如果从这些技术中获取所有应用程序,则根本受益不多(尤其是功率/热限制,允许单个核以比多个核更高的频率运行),并且开发成本很高。然而这些技术确实存在,并且理论上可以在设计为使用单个内核的应用程序中使用多个内核。


0

不,那不可能。明确编写了一个程序以使用多个内核。在多个内核中完成这项工作并非易事。它要求同步所有线程。就像一个人扔球,另一个人接球,一个人擦球,一个人清洗,一个人检查球中是否有足够的空气。现在想象每个字符在线程中彼此独立地运行。有人试图在未掷出球时接住球。或者有人在打球时试图擦亮球。或两个试图同时接球和掷球的角色。崩溃的方法有很多。因此,程序员需要仔细地重新设计一个核心应用程序,以便它可以利用多个核心。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.