LINUX.ORG.RU

Лаконичный способ получить число ядер процессора в Linux?

 


0

1

Есть ли у кого варианты короче данного?

say $n=do { open $_,"</proc/cpuinfo"; grep {!index($_,"\n")} <$_> }

Ещё:

say $n=scalar(@{$_}=</sys/bus/cpu/devices/*>)
★★★★★

Последнее исправление: DRVTiny (всего исправлений: 1)
Ответ на: комментарий от DRVTiny

Сколько раз в секунду количество процессоров опрашиваешь?

anonymous
()
Ответ на: комментарий от disarmer

Спасибо, так намного лучше! Не понимаю только, как это работает? Присвоили пустому списку список файлов, но scalar от этого списка всё равно равен количеству процессов... Как так7

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

но scalar от этого списка всё равно равен количеству процессов...

Которое равно количеству файлов, видимо. Просто размер списка.

no-such-file ★★★★★
()

На perl 5.22 эти варианты вообще не работают

ok@vk:~$ perl -e 'say $n=do { open $_,"</proc/cpuinfo"; grep {!index($_,"\n")} <$_> }'
Can't call method "say" on an undefined value at -e line 1, <$_> line 54.
ok@vk:~$ perl -e 'say $n=scalar(@{$_}=</sys/bus/cpu/devices/*>)'
Can't call method "say" on an undefined value at -e line 1.

А ты честно считаешь количество ядер, или hyperthreading тоже считаешь за дополнительные ядра?

ok@vk:~$ cat /proc/cpuinfo | perl ~/Документы/scripts/cpuinfo/linux_cpuinfo.pl 
1 cpu ( each has 2 cores, 2 threads ); total cores 2 ; total threads : 2
ok@vk:~/Документы/scripts/cpuinfo$ cat examples/linux/proc_cpuinfo_x240-11 | ./linux_cpuinfo.pl 
2 cpu ( each has 8 cores, 16 threads ); total cores 16 ; total threads : 32

Кодом пугать не будут, perl golf там даже близко нет - 2 кб

router ★★★★★
()
Последнее исправление: router (всего исправлений: 1)
Ответ на: комментарий от no-such-file

ОК, а что со сплитом-то? Раньше всё нормально было :) Он не должен бы считать, что его в скалярном контексте вызвали... а какие ещё могут быть причины?

say join(","=>split //,q(abcdefghij));
=> a,b,c,d,e,f,g,h,i,j
DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

Это goatse оператор: http://search.cpan.org/dist/perlsecret/lib/perlsecret.pod#Goatse

По сути, вызываем glob в списковом контексте, получаем список, список приводим к скалярному значению (получим длину списка)

Условно это то же самое что:

@arr=</sys/bus/cpu/devices/*>;
$n=@arr;

disarmer ★★★
()
Ответ на: комментарий от DRVTiny

The reason is that split() never splits to more fields than necessary. And the compiler interprets storing the results in () as not caring about the results, so split() will not split the string at all, and thus return the full string, which gives a list of only one element in scalar context, hence the 1.

disarmer ★★★
()
Ответ на: комментарий от router

Это да, я вообще считаю cpu/ядра/потоки так:

% perl -nE 'chomp;if(m/(.*?)\s*:\s*(.+)?$/){$_{$1=~y/ /_/r}=$2;next}$hv//=" virtualized" if $_{flags}=~m/hypervisor/;$k=sprintf"%i.%s x%i/%i",$_{physical_id}//$c++,$_{model_name},$_{cpu_cores}//1,$_{siblings}//1;$k=~s/ +/ /g;$t=$k=~s/^\d+\.//r;next if$h{$k}++;$t{$t}++;END{say join("\t+\t",map {"$t{$_}x $_"}sort keys %t),$hv}' /proc/cpuinfo
1x AMD FX(tm)-8300 Eight-Core Processor x4/8

disarmer ★★★
()
Последнее исправление: disarmer (всего исправлений: 1)

Опять какой-то цирк непросвещенных.

use POSIX;

$ncpu = POSIX::sysconf(&POSIX::_SC_NPROCESSORS_ONLN);

kawaii_neko ★★★★
()
Ответ на: комментарий от disarmer

Можно и use 5.10.1, например - say стала стандартной функцией уже довольно давно.

The reason is that split() never splits to more fields than necessary.

А откуда цитата? Многие знания преумножают количество «незнаний». Почитал внимательно просто оф.доку по split'у, а там... такое... Я удивляюсь, как при столь изощрённом и сильно неочевидном алгоритме работы эта функция ещё и умудряется быть очень быстрой.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

А откуда цитата?

Всё из той же ссылки, там дальше такой же случай со split рассматривается. В других случаях, я на такую оптимизацию split не натыкался

disarmer ★★★
()

В фряхе это

% sysctl -n hw.ncpu
4

А в этих ваших линуксах сплошной геморрой - надо ставить виртуалку, дать её все ядра, на неё поставить фряху, прокинуть 22 порт, и

$ ssh vm sysctl -n hw.ncpu
4

но всё равно получается короче чем ваши извращения с /proc и /sys.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

К чему это вообще? Речь идёт не о том, как в shell-скрипте получить число процессоров, речь о perl'е.

Или вы в программе на Си тоже будете sysctl -n hw.ncpu запускать?

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от slovazap

В фряхе это
sysctl -n hw.ncpu

Кошерная фряха должна выдавать 4.11

devl547 ★★★★★
()
Последнее исправление: devl547 (всего исправлений: 1)
Ответ на: комментарий от DRVTiny

В си есть sysctl(3) который делает то же самое. И в перле есть.

slovazap ★★★★★
()
Ответ на: комментарий от DRVTiny

В C есть sysconf(3), закреплённый POSIX. В Linux есть не совсем стандартные расширения (в man page всё есть), например, _SC_NPROCESSORS_ONLN, который вам и нужен.

Я не пишу на Perl, но в библиотеке, вроде, есть интерфейс к POSIX: https://perldoc.perl.org/POSIX.html. Функция sysconf там тоже есть.

zuzzas
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.