Archives pour la catégorie Windows

Récupérer des informations sur le processeur avec MATLAB et la SDL 2

La bibliothèque SDL 2 (Simple DirectMedia Layer) possède quelques fonctionnalités pour récupérer des informations sur le CPU (voir CPU Feature Detection). J’ai donc écrit un fichier MEX qui permet de récupérer ces informations avec MATLAB. Vous pouvez télécharger le code ici.

Il faut installer les outils de développement de la SDL 2 et compiler le fichier MEX avant la première utilisation. Toutes les informations sont contenues dans les entêtes des fichiers getCpuInfoSdl2.m et getCpuInfoSdl2mx.c. Pour les utilisateurs sur Mac, vous pouvez vous référer à ce billet pour la compilation du MEX.

Les information suivantes sont renvoyées :

  • cpuCacheLineSize : taille du cache L1 en Ko
  • cpuCount : nombre de cœurs (Intel hyperthreading compris)
  • systemRAM : quantité de mémoire RAM installée

Le code renvoi également, sous forme de booléens, la disponibilité des jeux d’instructions suivants :

Récupérer la désignation du CPU en ligne de commandes avec Windows, Linux et Mac OS X

Il y a quelques temps déjà, j’avais posté une série de trois billets sur le thème de l’identification de processeur avec MATLAB (1, 2 et 3) dans laquelle j’exposais plusieurs méthodes plus ou moins fiables et portables.

J’ai récemment appris une méthode permettant de récupérer le modèle du processeur avec Mac OS X et, de fil en aiguille, avec Windows. J’ai donc complété le deuxième billet de la série en conséquence.

Voici synthétisées ici, les trois lignes de commandes pour les trois systèmes d’exploitation que l’on trouve majoritairement sur nos machines.

L’information renvoyée est du type :

Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz

Bien entendu, il est possible d’extraire d’autres informations à propos du CPU en utilisant des variantes de ces commandes.

Windows

Avec Windows, il suffit d’utiliser le système de gestion WMI :

for /f "tokens=2 delims==" %A in ('wmic cpu get name /value') do @(echo %A)

Testé avec Windows 7.

Linux

Avec Linux, il suffit d’analyser le contenu de /proc/cpuinfo :

grep -m 1 "model name" /proc/cpuinfo | cut -d: -f2

Testé avec Xubuntu 12.04.

Mac OS X

Avec Mac OS X, il suffit d’utiliser l’interface sysctl :

sysctl machdep.cpu | grep brand_string | cut -d: -f2

Testé avec Mac OS X 10.9

Ordre des appels à ispc, isunix et ismac avec MATLAB

J’ai récemment déployé une application sur Mac OS X avec le MATLAB Compiler. Elle n’était utilisée jusqu’à présent que sur Windows et Linux.

Cette application contient un outil qui me permet de récupérer certaines caractéristiques de la machine. Je récupère, entres autres, le nom de l’architecture où s’exécute le code, à savoir Windows, Linux ou Mac.

Code initial de récupération de l’architecture

Voici approximativement comment est codé le log :

fid = fopen('bug.log', 'wt');
if ispc
   fprintf(fid, 'OS: Windows\n');
elseif isunix
   fprintf(fid, 'OS: Linux\n');
else
   fprintf(fid, 'OS: Mac\n');
end
fclose(fid);

Or cette façon de procéder est fausse car, avec Mac OS X, le fichier bug.log contient la ligne suivante :

OS: Linux

Bizarre, non ?

D’où vient l’erreur ?

Les fonctions ispc, isunix et ismac utilisent en fait la fonction computer qui renvoi l’architecture de la machine sous forme d’une chaine de caractères qui peut être :

  • ‘PCWIN’ ou ‘PCWIN64′ pour Windows
  • ‘GLNX86′ ou ‘GLNXA64′ pour Linux
  • ‘MACI64′ pour Mac

Les trois architectures devraient donc être bien différenciées.

Pourquoi mon implémentation du log ne fonctionne-t-elle pas correctement ?

Étudions les fonctions ispc, isunix et ismac. Vous pouvez visualiser leur code en ouvrant les fichiers ispc.m, ismac.m et isunix.m dans le MATLAB Editor ou dans n’importe quel éditeur de texte.

ispc

Le fonction ispc compare simplement les deux premiers caractères de la chaine renvoyée par la fonction computer. Si ces deux caractères sont ‘PC’ alors la machine tourne sur Windows.

ismac

Sur le même principe, la fonction ismac teste si les trois premiers caractères de la chaine renvoyée par computer sont ‘MAC’. Tout est normal.

isunix

Surprise, la fonction isunix fait simplement l’inverse de la fonction ispc.

Le code de isunix est équivalent à :

isunix = ~ispc;

Donc pour MATLAB, tout ce qui n’est pas Windows est forcément Linux !

C’est utile à savoir, je corrige donc mon code.

Code corrigé de récupération de l’architecture

La condition ismac doit donc obligatoirement apparaître avant isunix :

fid = fopen('bug.log', 'wt');
if ispc
   fprintf(fid, 'OS: Windows\n');
elseif ismac
   fprintf(fid, 'OS: Mac\n');
else
   fprintf(fid, 'OS: Linux\n');
end
fclose(fid);

Me voila prévenu, et vous aussi !

:)

Dans un prochain billet, je vous expliquerai l’intérêt pour MATLAB d’assimiler Mac à Linux avec isunix (les utilisateurs avertis connaissent déjà sans aucun doute la réponse). ;)