Archives pour la catégorie MATLAB

Identification de processeur sous MATLAB (2/3)

Dans mon précédent billet, je vous ai montré qu’il ne fallait pas faire confiance à la fonction feature(‘GetCPU’) pour obtenir les caractéristiques du processeur (CPU) de votre machine.

Il existe une méthode plus robuste dépendante du système d’exploitation

Avec Windows, il est possible d’utiliser la fonction getenv dans MATLAB comme ceci :

getenv('PROCESSOR_IDENTIFIER')

ans =

Intel64 Family 6 Model 42 Stepping 7, GenuineIntel

Avec Linux, il suffit de traiter les données contenues dans /proc/cpuinfo avec MATLAB comme ceci :

[status,data{1}] = system('grep -m 1 "vendor_id" /proc/cpuinfo | cut -d: -f2');
[status,data{2}] = system('grep -m 1 "cpu family" /proc/cpuinfo | cut -d: -f2');
[status,data{3}] = system('grep -m 1 "model" /proc/cpuinfo | cut -d: -f2');
[status,data{4}] = system('grep -m 1 "stepping" /proc/cpuinfo | cut -d: -f2');

Avec Mac OS X, il faut exploiter les retours de la commande sysctl machdep.cpu :

[status,data{1}] = system('sysctl machdep.cpu | grep cpu.vendor | cut -d: -f2');
[status,data{2}] = system('sysctl machdep.cpu | grep cpu.family | cut -d: -f2');
[status,data{3}] = system('sysctl machdep.cpu | grep cpu.model | cut -d: -f2');
[status,data{4}] = system('sysctl machdep.cpu | grep cpu.stepping | cut -d: -f2');

Ce qui donne par exemple :

fprintf('Family %s Model %s Stepping %s, %s\n',strtrim(data{2}),strtrim(data{3}),strtrim(data{4}),strtrim(data{1}));

Family 6 Model 42 Stepping 7, GenuineIntel

Pour rappel, la valeur de Model était 10 dans le précédent billet et cela posait problème pour déterminer avec exactitude le CPU.

Ici, il faut convertir 42 en binaire, soit 00101010. Il faut ensuite séparer les bits en deux paquets comme ceci : 0010 et 1010. La première valeur correspond à l’Extended Model qui si on se reporte au tableau Intel nous permet bien de cibler : « 2nd Generation Intel core Processor Family Mobile (Sandy Bridge) ». Ce qui correspond bien à la famille de mon CPU.

Note : avec Mac OS X, on peut directement récupérer l’Extended Model en passant cpu.extmodel à grep.

Pour identifier le CPU avec précision dans sa famille, il faut identifier plusieurs paramètres comme la fréquence, les mémoire caches… Ce qui peut s’avérer assez fastidieux.

Il nous faudrait une solution plus rapide qui donnerait la désignation commerciale du CPU en une seule ligne.

Avec Windows :

[status,cpuname] = system('for /f "tokens=2 delims==" %A in (''wmic cpu get name /value'') do @(echo %A)');

Avec Linux :

[status,cpuname] = system('grep -m 1 "model name" /proc/cpuinfo | cut -d: -f2');

Avec Mac OS X :

[status,cpuname] = system('sysctl machdep.cpu | grep brand_string | cut -d: -f2');

Ce qui donne par exemple :

cpuname =

Intel(R) Core(TM) i5-2430M CPU @ 2.40GHz

C’est beaucoup mieux :)

Dans le prochain billet, je vous montrerai comment demander directement ces informations au CPU lui-même à l’aide de l’opcode CPUID. Cette dernière solution sera portable et fonctionnera donc quelque soit le système d’exploitation.

Identification de processeur sous MATLAB (1/3)

Vous pouvez identifier le modèle du processeur (CPU) installé sur votre machine avec MATLAB à l’aide de la fonction non documentée feature.

Sur mon portable, voici ce que cela donne :

feature('GetCPU')

ans =

x86 Family 6 Model 10 Stepping 7, GenuineIntel

La dernière donnée nous donne le nom du fabricant. Les deux plus courants sont « GenuineIntel » pour Intel et « AuthenticAMD » pour AMD.

Il suffit alors de se référer à une liste donnée par le fabricant du CPU. Dans mon cas, il s’agit d’Intel et la fiche est disponible à cette adresse : Intel® Processor Identification and the CPUID Instruction (voir CPUID Specification pour les processeurs AMD)

Je me reporte donc à la table 5-4 « Intel486 and Subsequent Processeor Signatures » (p23) et je cherche les valeurs 6 (Family) et 10 (Model) converties en binaire (soit respectivement 0110 et 1010) dans les deux colonnes « Family Code » et « Model No. »

J’obtiens trois résultats possibles : « Pentium III Xeon processor » ou « Intel Core i7 processor or Intel Xeon processor » ou encore « 2nd Generation Intel core Processor Family Mobile (Sandy Bridge) ».

La dernière est la bonne puisque mon portable est équipé d’un Intel Core i5-2430M

Il manque en fait une information non retournée par la fonction feature. Il s’agit de la valeur de l’Extended Model.

On trouve en effet 0000 pour les « Pentium III Xeon », « 0001 » pour les « Intel Core i7″ et 0010 pour les « Intel Core Mobile de 2ème génération ».

Essayez sur votre machine et dites-moi si vous pouvez identifier à coup sûr votre CPU avec feature(‘GetCPU’) !

Dans un prochain billet, je vous montrerai comment identifier sans erreur votre CPU. Vous saurez également comment obtenir directement son intitulé commercial comme « Intel Core i5-2430M » dans mon cas.

Quand MATLAB confond Windows 7 avec Vista

J’utilise MATLAB R2009a sur Windows 7 (sans aucun problème).

Voici ce que me retourne la commande version :

Operating System: Microsoft Windows Vista Version 6.1 (Build 7601: Service Pack 1)

« Microsoft Windows Vista » ? Ah bon !

Pour être honnête, MATLAB n’a pas tout faux. En effet le numéro de version de Windows (ici 6.1) correspond bien à Windows 7.

La version R2009a est sortie en mars 2009 alors que Windows 7 n’est sorti qu’en octobre de la même année. Ceci explique sans aucun doute l’erreur d’interprétation.

Conclusion : il est plus prudent de se référer au numéro de version plutôt qu’à son interprétation littérale.

Un petit truc au passage, ces informations peuvent être récupérées via la fonction non documentée feature :

feature('GetWinSys')

ans =

Version 6.1 (Build 7601: Service Pack 1)

Mais attention :

feature('GetOS')

ans =

Microsoft Windows Vista

Dans un prochain billet, je vous montrerai également que MATLAB sait déterminer le processeur de votre ordinateur… mais pas toujours très précisément. :(