核心(或 CPU)是计算机中执行代码的物理元素。通常,每个内核都具有执行计算、寄存器文件、中断线等所需的所有元素。
大多数操作系统将应用程序表示为进程。这意味着应用程序有自己的地址空间(== 内存视图),操作系统确保该视图及其内容与其他应用程序隔离。
一个进程由一个或多个线程组成,这些线程通过在 CPU 上执行机器代码来执行应用程序的实际工作。操作系统确定哪个线程在哪个 CPU 上执行(通过使用巧妙的启发式方法来改善负载平衡、能源消耗等)。如果您的应用程序仅包含一个线程,那么您的整个多 CPU 系统不会对您有太大帮助,因为它仍然只会为您的应用程序使用一个 CPU。(但是,整体性能可能仍会提高,因为操作系统将在其他 CPU 上运行其他应用程序,因此它们不会与第一个 CPU 混合)。
现在回答您的具体问题:
1)操作系统通常允许您至少提示您要在哪个内核上执行某些线程。OpenMP 所做的是生成生成一定数量线程的代码,以在多个线程中分配来自程序循环的共享计算工作。它可以使用操作系统的提示机制(参见:线程关联)来执行此操作。但是,OpenMP 应用程序仍将与其他应用程序同时运行,因此操作系统可以自由地中断其中一个线程并在 CPU 上安排其他(可能不相关的)工作。实际上,根据您的情况,您可能希望应用许多不同的调度方案,但这是非常具体的,并且大多数时候您应该能够相信您的操作系统会为您做正确的事情。
2) 即使您在多核 CPU 上运行单线程应用程序,您也会注意到其他 CPU 也在工作。这来自a)同时执行其工作的操作系统和b)来自您的应用程序永远不会单独运行的事实——每个正在运行的系统都由一大堆并发执行的任务组成。检查 Windows 的任务管理器(或Linux 上的ps/top)以检查正在运行的内容。