Multithreading 创建的线程数为12,但仍仅在12核CPU中的一个核上运行
我有一个奇怪的问题。我有一个MatlabMexFunction,其中使用了OpenMP指令/函数。在开始并行部分(parallel for…)之前,我使用命令设置并打印创建的线程数:Multithreading 创建的线程数为12,但仍仅在12核CPU中的一个核上运行,multithreading,matlab,openmp,mex,single-threaded,Multithreading,Matlab,Openmp,Mex,Single Threaded,我有一个奇怪的问题。我有一个MatlabMexFunction,其中使用了OpenMP指令/函数。在开始并行部分(parallel for…)之前,我使用命令设置并打印创建的线程数: 问题是,在输出时,它会打印'numofthreads=12',但后面的并行部分不会在我的机器的所有12个内核上运行(但只在1个内核上运行)。我的程序是很久以前写的,我以前没有这样的问题(它在所有12个内核上运行)。最近,系统损坏,操作系统(Win 7 Pro)重新安装了Matlab 2011b的更新版本(早于2
问题是,在输出时,它会打印'numofthreads=12',但后面的并行部分不会在我的机器的所有12个内核上运行(但只在1个内核上运行)。我的程序是很久以前写的,我以前没有这样的问题(它在所有12个内核上运行)。最近,系统损坏,操作系统(Win 7 Pro)重新安装了Matlab 2011b的更新版本(早于2010b)。我还安装了VisualStudio2010 Pro
是否有我遗漏或忽略的内容?是否在
omp parallel for
块中调用mex函数
我最幸运的是先按顺序提取指针,然后并行处理,最后按顺序将结果加载到matlab变量中。这样,并行代码是纯C++的,没有调用MEX函数(可以等待共享锁)。
当然,请确保您实际上是在启用OpenMP的情况下编译的。。。否则,指令将被忽略,并以顺序代码结束。是否在
omp parallel for
块中调用mex函数
我最幸运的是先按顺序提取指针,然后并行处理,最后按顺序将结果加载到matlab变量中。这样,并行代码是纯C++的,没有调用MEX函数(可以等待共享锁)。
当然,请确保您实际上是在启用OpenMP的情况下编译的。。。否则,指令会被忽略,最终会产生顺序代码。您是否将Windows配置为仅使用一个核心。Windows Server 2008也有限制,这取决于您购买的editon,使用了多少内核()。@AloisKraus:问题是Windows 7 Pro,它支持两个物理处理器插槽(以及多个内核/插槽)。您是否将Windows配置为仅使用一个内核。Windows Server 2008也有限制,这取决于您购买的editon使用了多少内核()。@AloisKraus:问题是Windows 7 Pro,它支持两个物理处理器插槽(以及多个内核/插槽)。
nP = omp_get_num_procs();
omp_set_num_threads(nP);
mexPrintf("\n Num of threads= %d\n",nP);
.
.
.
#pragma omp parallel for shared(...)