Windows 7 为多核CPU开发软件-是否必须手动优化程序才能使用所有核?或者这是自动发生的?

Windows 7 为多核CPU开发软件-是否必须手动优化程序才能使用所有核?或者这是自动发生的?,windows-7,parallel-processing,multiprocessing,opencl,cpu,Windows 7,Parallel Processing,Multiprocessing,Opencl,Cpu,现在出现的绝大多数CPU都包含多个可以同时并行运行的内核 我只是想知道,从使用所有可用CPU核尽可能快地执行程序的角度来看,程序员是否需要考虑正在开发的软件将在多核CPU上运行?例如,是否必须手动配置正在开发的软件,以便为每个CPU核心分配不同的任务?或者OS/CPU会自动识别并选择程序的哪些部分可以在不同的内核上并行运行 如果这似乎是一个简单或愚蠢的问题,请道歉。我对并行编程这个话题是完全陌生的,在我的研究早期,我遇到了一些相互矛盾的信息——一些资料表明,程序员必须手动配置他们的软件,以便使用

现在出现的绝大多数CPU都包含多个可以同时并行运行的内核

我只是想知道,从使用所有可用CPU核尽可能快地执行程序的角度来看,程序员是否需要考虑正在开发的软件将在多核CPU上运行?例如,是否必须手动配置正在开发的软件,以便为每个CPU核心分配不同的任务?或者OS/CPU会自动识别并选择程序的哪些部分可以在不同的内核上并行运行

如果这似乎是一个简单或愚蠢的问题,请道歉。我对并行编程这个话题是完全陌生的,在我的研究早期,我遇到了一些相互矛盾的信息——一些资料表明,程序员必须手动配置他们的软件,以便使用多个CPU核心(我认为这是更可信的选择)-和其他来源指出,OS/CPU会自动识别并选择哪些任务可以在不同的CPU内核上并行运行(我认为这是一个不太可信的选项,因为自动识别这一点涉及的复杂性)

为了防止不同的操作系统、CPU或编程语言在并行计算或多核环境中表现不同,我将使用Windows 7作为操作系统,使用Intel双核i7处理器,使用OpenCL作为编程语言


非常感谢您的帮助

实际上,这是半自动发生的。 更详细的答案将取决于您的应用程序性质、首选编程模型和目标体系结构

更多解释:

为了有效利用多核硬件(在您的情况下,让尽可能多的核处于忙碌状态),首先1)需要“并行化”算法本身-使其“并发”,2)使用多线程(最常见)或多进程(罕见)并行编程API之一,例如“OpenMP”、“英特尔TBB”、“OpenCL”,“Posix线程”或(对于多进程)“MPI”,以便高效且经常自动地将并发程序的不同“部分”分配给不同的线程(或者,在罕见的情况下,分配给进程)

给出了此类并行编程(使用OpenMP)的一个最简单的可能示例


现在,您已经告诉我您正在使用OpenCL作为CPU的编程模型。在某些情况下,当您使用供应商提供的OpenCL实现(如Intel OpenCL)时,您可以使用“NDRange”半自动地将OpenCL内核分配给各个线程执行以及其他OpenCL概念,如为Intel Xeon Phi协处理器解释的(不完全是CPU编程,但类似的想法)或(更一般但更高级的文章)

然而,使用OpenCL作为CPU的通用多线程编程API——绝对不是最简单的方法;就最终性能而言,它并不总是最优的。在某些应用程序类型中,OpenCL对通用CPU多线程编程没有什么意义,但这在很大程度上取决于您的算法性质和目标体系结构


有一篇关于OpenCL和OpenMP/TBB的文章非常过时,但仍然合理。这在某种意义上是过时的,因为OpenMP 4.0现在还提供了执行线程*+SIMD*编程的可靠功能(如果您更详细地探讨给定主题,这将使您对未来感兴趣)。这就是为什么我会说OpenMP现在似乎是首选,bug TBB、MPI或OpenCL在某些情况下也可能是合适的。

最简单的方法是使用线程-线程通常由操作系统在不同的内核上调度。然后,您的代码将使用单个核心正常运行,但如果多个核心可用,则将利用它们。如果您的程序只是单线程的,那么您将不会从多核中获得任何显著的好处。