Matlab更改了OpenMP选项?

108次浏览(最近30天)
罗伯托"class=
罗伯托 2021年7月28日下午4:30
编辑: 罗伯托2021年8月1日2点52分
在我尝试了MATLAB (R2021a)中的parfor(带有默认选项)之后,我在使用openmp的Rcpp Rstudio中的并行计算变得慢得多。我在Rstudio中的代码是用c++编写的,并通过Rcpp包进行编译。但是现在,当我在Rstudio中使用多个线程时,计算速度比以前要慢得多。可能是MATLAB改变了我编译器中的一些默认设置?在这种情况下,我如何逆转这些变化呢?我使用的是ubuntu 20.04。我有一个AMD处理器。
在C ++中,我使用一个非常简单的循环,线程之间没有交互(完全并行):
OMP_SET_NUM_THREADS(NPROC);
Pragma Omp.计划(静态)并行
(int II = 0; II <= nproc-1; II ++){
//命令到将作业发送到线程ii
我认为这与MATLAB创建一个12个工人的池有关。这就是MATLAB在使用parfor时所做的。现在我在Rstudio中的并行计算行为非常不同(而且很慢)。例如,如果我在我的代码中指定32个线程(这是我有64个线程的50%),总的CPU使用(根据top)只有大约20%(大约是12 / 64)。如果我只指定5个线程(大约是8%),那么总CPU使用也大约是20%。但是,如果我指定3个线程,那么总CPU是15%,而一个线程是9%。
在我使用matlab之前,CPU使用与我指定的线程数成比例。现在它不是。如何撤消Matlab制作的并行计算的设置?
我检查了许多内部变量的OpenMP的值,问题不存在:
f = op_get_num_threads()
ddd = op_get_dynamic()
rcout.<< "get thread " << f << std::endl
rcout.< < "得到动力学<< DDD << std::endl
rcout.<<“几个”<< OMP_GET_THREAD_LIMIT()<<“”“<< OMP_GET_MAX_THREADS()<< OMP_GET_NESTED()<<”<< OMP_GET_PROC_BIND()<<“”“op_get_default_device()<<“”<< OMP_GET_MAX_TASK_PRIORITY()<<" < <" " << omp_get_max_active_levels()< < " "<<
< < std:: endl;
rcout.< < < < omp_get_num_places“会议” () << " " << omp_get_place_num_procs << " " << omp_get_place_num << " " << omp_get_partition_num_places () < <STD :: ENDL.
所有这些变量都具有与其他计算机正常工作的计算机相同的值。

接受答案

罗伯托"class=
罗伯托 于2021年7月31日在6:31
我通过重新安装Ubuntu解决了这个问题,如下所示:
现在我的C ++代码与MATLAB一样快,当我使用5个线程时速度快4倍,使用32线程时速度快20倍。
虽然它已经运行了很好,但我想没有必要重新安装Ubuntu来撤消Matlab制作的并行计算设置。如果您知道任何其他方式,请告诉我。

答案(1)

沃尔特罗伯森"class=
沃尔特罗伯森 2021年7月28日下午5点05分
Roberto,您是否故意配置了集群配置文件(可能是名为“default”的配置文件),以便为每个worker提供多个线程?默认值是每个worker一个线程。 //www.tianjin-qmedu.com/help/matlab/ref/maxnumcompthreads.html.
还要仔细检查 OMP_NUM_THREADS. 以防它被设为1。
当使用MATLAB Coder时,我看到了使用OpenMP应用程序接口与parfor()的一些限制,但我目前不清楚这是否对代码不生成的情况有影响。 //www.tianjin-qmedu.com/help/coder/ref/parfor.html.
6评论
沃尔特罗伯森"class=
沃尔特罗伯森 在2021年7月28日8:25
哇!这令人惊讶的是复杂!

登录评论。

s manbetx 845


发布

R2021A

社区宝藏狩猎

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!