创建的线程数为 12,但仍仅在 12 核 CPU 中的一个核上运行
Posted
技术标签:
【中文标题】创建的线程数为 12,但仍仅在 12 核 CPU 中的一个核上运行【英文标题】:Number of threads created is 12 but still runs only on one core of 12 core-CPU 【发布时间】:2012-01-16 20:41:26 【问题描述】:我有一个奇怪的问题。我有一个使用 OpenMP 指令/函数的 Matlab mexfunction。在并行部分开始之前(parallel for...),我使用命令来设置和打印创建的线程数:
nP = omp_get_num_procs();
omp_set_num_threads(nP);
mexPrintf("\n Num of threads= %d\n",nP);
.
.
.
#pragma omp parallel for shared(...)
问题是,在输出中,它会打印“线程数 = 12”,但随后的并行部分并未在我机器的所有 12 个内核上运行(但仅在 1 个内核上运行)。我的程序是很久以前写的,我之前没有这样的问题(它在所有 12 个内核上运行)。最近,系统损坏,操作系统(Win 7 Pro)重新安装了 Matlab 2011b(2010b 早期)的更新版本。我还安装了 Visual Studio 2010 Pro。
有什么我遗漏或忽略的吗?
【问题讨论】:
您是否将 Windows 配置为仅使用一个内核? sevenforums.com/tutorials/…。 Windows Server 2008 也有限制,具体取决于您购买的版本,使用了多少内核 (directionsonmicrosoft.com/sample/DOMIS/update/2008/02feb/…)。 @AloisKraus:问题是 Windows 7 Pro,它支持两个物理处理器插槽(和许多内核/插槽)。 【参考方案1】:您是否在 omp parallel for
块内调用 mex 函数?
我最幸运的是先按顺序提取指针,然后并行处理,最后按顺序将结果加载到 matlab 变量中。这样并行代码是纯 C++,没有调用 mex 函数(可以等待共享锁)。
当然,请确保您实际上是在启用 OpenMP 的情况下进行编译...否则指令会被忽略,您最终会得到顺序代码。
【讨论】:
以上是关于创建的线程数为 12,但仍仅在 12 核 CPU 中的一个核上运行的主要内容,如果未能解决你的问题,请参考以下文章