是否可以为原本不是为这种程序设计的程序提供(或进一步)多核线程处理能力?
通过创建一个“虚拟”CPU核心(或者为i7's创建超线程,虚拟内核),程序将其视为一个单一的内核/线程,但在这个虚拟核的另一端是一个程序/工具/实用程序,它将工作分割到多个核/线程中。对于那些已经为多核支持而设计的程序,虚拟核能够增加可用核的数量。
我觉得这将是有用的,因为最近几年的趋势是增加核心数量相对于CPU速度的总体增长,而不是CPU与摩尔定律的“天花板”相悖,以及在软件开发中似乎缓慢或落后的推动,以利用这些不断增长的CPU核心。
我意识到这样的事情可能并不简单,也不容易完成,但我很想知道这样做是否可行。
发布于 2020-01-25 13:11:41
对于以命令式/过程式编写的程序来说,这几乎是不可能的,因为单独的线程可能访问共享数据,而且更大粒度的并行性的正确语义也难以确保。
使用函数样式编写的程序可能会自动并行化,因为通常共享状态要少得多,但仍然很难自动确定创建新线程的开销何时会通过改进的总体执行时间得到回报。
发布于 2020-01-25 13:47:25
对于一个常规的应用程序,只有线程。无论处理器是否有多个核心,还是使用一群小妖精来完成任务,都是无关紧要的。重要的是应用程序实现的任务以及这些任务是否可以在维护功能的同时并行执行。
有些应用程序可以重新加工以从线程中获益,而另一些应用程序则不能。这都取决于逻辑。
发布于 2020-01-26 19:12:24
我认为您将得到的最接近的是类似于C、C++和FORTAN的OpenMP。这个库允许您只需在代码块之前插入一个或两个杂注,就可以并行化一些构造,如for
循环:
void simple(int n, float *a, float *b)
{
int i;
// This assumes the blocks pointed to by a and b don't overlap
#pragma omp parallel for
for (i = 1; i < n; i++) /* i is private by default */
b[i] = (a[i] + a[i-1]) / 2.0;
}
但这不是魔法。正如其他答案所指出的,并行处理的困难部分在于弄清楚如何处理跨执行线程访问共享数据。有几个问题不需要跨线程共享数据,在这种情况下,OpenMP使得并行化现有代码变得非常简单。但是,通常情况下,您必须能够识别数据何时在线程间共享,并选择适当的结构来调节对该数据的访问。这可能需要一些非常艰苦和深入的思考,并且可能需要对现有代码进行重大重构。
https://softwareengineering.stackexchange.com/questions/404258
复制相似问题