【发布时间】:2015-10-17 01:06:21
【问题描述】:
我正在使用 MATLAB 的 quadprog,它在我的本地机器上运行非常缓慢。
当我在远程机器上运行确切的代码时,它会在 10 分钟内完成。当我在本地机器上运行它时,即使 24 小时后它也不会终止(我有时会杀死它)。
当代码运行时,我的本地机器上的内存使用量为 ~10GB RAM(而我的本地机器有 ~100GB 的可用 RAM)。远程机器上的使用量是 20-30GB RAM。
知道如何让它在我的本地机器上运行得更快吗?
10 月 18 日重要编辑:我在两台机器上都执行了一个较小规模的问题。在本地机器上需要 1900 秒,在远程机器上需要 8 秒,增益约为 240。这两台机器也有多个多核处理器。这次我注意到htop,远程机器使用它的所有处理器,而本地机器只使用一个处理器(尽管所有其他处理器都可用)。 知道如何让 MATLAB 使用本地机器上的所有处理器吗?
一些旁注:
1:nnz 代表 H,Aeq =~ 10e6,尺寸约为 11e6 x 11e6
2:只有等式约束的四边形编程有一个封闭形式的解决方案(参见Boyd)。当我使用封闭形式的解决方案解决它时,在我的本地机器上大约需要 10 分钟,而在远程机器上需要 5 分钟。虽然两者都消耗约 20-30GB 的内存。由于我想添加不等式约束,我希望能够在我的本地机器上快速运行 quadprog。
3:下面是我机器上的cat /proc/cpuinfo与远程机器(远程机器更强,但本地机器也很强):14核对4核的增益约为x3.5(不采取多-线程开销),并且 AVX 与 SSE 最大〜x2。所以它不能解释我看到的 240 的增益。此外,当我使用封闭形式的解决方案(而不是 quadprog)时,远程机器与本地机器相比只有 x2 的增益。
4:我确定我运行的是 64 位版本,因为我看到内存消耗是 10-15GB。
5:本地系统运行RHEL,远程运行ubuntu。
本地uname -a结果:
Linux hostname 2.6.32-573.7.1.el6.x86_64 #1 SMP Thu Sep 10 13:42:16 EDT 2015 x86_64 x86_64 x86_64 GNU/Linux
远程uname -a结果:
Linux hostname 3.13.0-65-generic #105-Ubuntu SMP Mon Sep 21 18:50:58 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
6:机器上启用了超线程。我用this 脚本检查了它。
7:按照某人的建议启动并行池没有帮助。
谢谢!
单个处理器的本地计算机 cpu 信息(多个)
vendor_id : GenuineIntel
cpu family : 6
model : 26
model name : Intel(R) Xeon(R) CPU E5520 @ 2.27GHz
stepping : 5
microcode : 25
cpu MHz : 1600.000
cache size : 8192 KB
physical id : 1
siblings : 8
core id : 3
cpu cores : 4
apicid : 23
initial apicid : 23
fpu : yes
fpu_exception : yes
cpui level : 11
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt lahf_lm ida dts tpr_shadow vnmi flexpriority ept vpid
bogomips : 4532.68
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
单个处理器的远程机器 cpu 信息(多个)
vendor_id : GenuineIntel
cpu family : 6
model : 63
model name : Intel(R) Xeon(R) CPU E5-2697 v3 @ 2.60GHz
stepping : 2
microcode : 0x2d
cpu MHz : 1200.000
cache size : 35840 KB
physical id : 1
siblings : 28
core id : 14
cpu cores : 14
apicid : 61
initial apicid : 61
fpu : yes
fpu_exception : yes
cpuid level : 15
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm ida arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid
bogomips : 5189.05
clflush size : 64
cache_alignment : 64
address sizes : 46 bits physical, 48 bits virtual
power management:
【问题讨论】:
-
什么版本的 MATLAB?
-
我用的是2014b版本。
-
在两台电脑上?是否有可能其中一个支持 AVX 而另一个不支持或类似的东西?此外,另一台计算机有 14 个内核,如果这个实现可以处理它们,它可能就是它。
-
请注意:MATLAB 不支持多/超线程,因为发现它比优化所有物理内核的使用要慢。
-
基于我非常有限的 Linux 经验,我建议你做一个极端的实验(找一个备用磁盘,只安装 RHEL 和 MATLAB,重新运行脚本)找出答案,因为我认为它可能来自 MATLAB 之外的东西。我看不出 MATLAB 无法在您的本地机器上实现多线程/多核计算的任何直接原因,这让我相信这可能是您对系统所做的其他事情使 MATLAB 表现不同。如果您的 MATLAB 正在执行任何多核处理,则可能值得测试。
标签: multithreading matlab rhel quadprog quadratic-programming