所以我有一些计算量很大的代码,可以愉快地使用32个线程或更高效地使用。我也可以通过我的学校访问一个拥有32个处理器核心的集群。 “甜!”你可能会说。
但是,唉,如果你没有让每个线程以专用方式与处理器配对,那么代码会非常不满意。对于数值倾向,我的BLAS实现如果运行的线程被换掉另一个,则会对效率产生重大影响。除了群集处于无政府状态之外,这不是问题。
没有作业调度程序或队列,群集也不会阻止人们启动作业,即使已经说出了所有资源。
这是我的问题:当我登录并想要运行我的代码时,我看到已经有四个人了。他们可能正在运行串行和并行作业的某种组合。我想尽可能多地使用尽可能多的线程(也就是说集群上所有剩余的资源)。我如何确定一些可以使用的度量,或者是所有其他用户使用的线程数,它们产生的峰值计算负载,还是其他一些快速可用的度量?
目前,我的解决方案是运行我的代码的一部分,其中包含1个线程,然后运行2个线程,然后运行32个线程,并查看我在实际执行时间内撞墙的位置。我通过几个线程从墙上退了回去然后开了一份大工作。这需要几分钟时间,我想找到一个更快的方法来找到适合启动的线程数。
谢谢,
- 安德鲁
编辑:
sehe的回答肯定回答了我关于如何获取线程数的原始问题。事实证明,这并不像我想象的那样有用。菲尔的评论让我走上了富有成效的道路。我现在正在做的是:
top -bn1 | grep load
获取信息。这对我来说很有用,因为我的应用程序是基于Matlab的,我可以从脚本发出一个UNIX调用,每隔一段时间获取一次这个信息,并调整我正在使用的线程数量到可用资源。
感谢您让我走上正确的轨道。
- 安德鲁
答案 0 :(得分:1)
如果您有足够的权限,请将线程固定到核心(线程关联);否则
perl -e 'map { ($u,$n)=split; $N{$u}+=$n } split /\n/,
`ps --no-header -eo uid,nlwp=`;
print "$_\t$N{$_}\n" for keys %N' | sort -rn
显示所有拥有每个用户的线程(假设是linux);以下限制为运行线程:
perl -e 'map { ($u,$n,$s)=split; $N{$u}+=$n } split /\n/,
`ps --no-header -eo uid,nlwp,stat= | grep R`;
print "$_\t$N{$_}\n" for keys %N' | sort -rn
您可以使用watch(1)
:
watch monitor.pl
并显示正在运行的线程。
#!/usr/bin/perl
use strict;
use warnings;
open(my $PS, 'ps --no-header -eo uid,nlwp,stat=|') or die "oops, ps doesn't like that";
my %users;
map { my ($u,$n,$s)=split; $users{$u}+=$n } (<$PS>);
close ($PS);
print "$_\t$users{$_}\n"
for sort { -($users{$a} <=> $users{$b}) }
keys %users;
答案 1 :(得分:0)
查看ps(1)命令是否支持“-L”选项以获取有关线程的信息。