IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Identifier les propriétés de CPUs


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut Identifier les propriétés de CPUs
    Pour qu'un programme puisse s'adapter automatiquement au processeur de la machine sur laquelle il tourne, il me faut identifier les propriétés du processeur.

    J'ai fait un petit programme de test pour cela. Vous le trouverez ci-joint et ça serait sympa si quelques uns pouvaient l'essayer sur leur processeur respectif sous Windows: en particulier les processeurs récents (Intel Core 2 Duo...) et les AMDs.

    A titre d'exemple voici ce que ça donne sur mon "vieux" P4 2.6GHz HT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    amd             0
    mmx             1
    sse             1
    sse2            1
    sse3            0
    3dnow           0
    multithreaded   1
    logical cpu     2
    L1 cache        1
    L2 cache        1

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Voilà ce que ça donne sur mon Athlon 64 X2 DualCore 3800+ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    amd          	0
    mmx          	0
    sse          	0
    sse2         	0
    sse3         	0
    3dnow        	0
    multithreaded	0
    logical cpu  	1
    L1 cache     	1
    L2 cache     	1
    C'est pas encore tout à fait au point

    Si tu veux une référence, j'ai croisé récemment un bout de code qui faisait ça, dans le code source de la SDL (fichier SDL_cpuinfo.c). Les sources sont dispo sur le site officiel.

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Merci
    De toute évidence, ça marche pas vraiment avec les AMDs. Même pas la toute première fonction qui est pourtant sensée en reconnaître un!

    Tu peux me donner un lien sur le code que tu proposes S'il-te-plaît, que je puisse l'examiner. Si tu ne l'as plus, je tacherai de le retrouver grâce à Google.

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    J'ai trouvé un fichier 'SDL_cpuinfo.c' sur internet, à toute première vue, il ne tient pas compte des processeurs AMD.

    Sinon voici mes sources, si tu veux bien les compiler et debugger pour voir ce qui ne va pas sur ton AMD...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    #ifndef CPUID_H
    #define CPUID_H
     
    struct cpuid_reg { unsigned int eax,ebx,ecx,edx; };
     
    #if defined(__ICL) || defined(_MSC_VER)
    #include <windows.h>
    inline cpuid_reg _cpuid(unsigned int a, unsigned int c=0)
    {
      cpuid_reg r;
      __try 
      {
        _asm  
        {
          mov eax, a
          mov ecx, c
          cpuid
          mov r.eax, eax
          mov r.ebx, ebx
          mov r.ecx, ecx
          mov r.edx, edx
        }
      } __except (EXCEPTION_EXECUTE_HANDLER) { r.eax=r.ebx=r.ecx=r.edx=0; }
      return r;
    }
    #elif defined(__GNUC__)
    inline cpuid_reg _cpuid(unsigned int a, unsigned int c=0)
    {
      cpuid_reg r;
      __asm__("cpuid":"=a"(r.eax),"=b"(r.ebx),"=c" (r.ecx),"=d"(r.edx):"a"(a),"c"(c));
      return r;
    }
    #endif
     
    inline cpuid_reg cpuid(unsigned int a, unsigned int c=0)
    {
      if (a<_cpuid(0).eax) 
        return _cpuid(a,c);
      cpuid_reg r={0,0,0,0};
      return r;
    }
     
     
    static char _cpu_name[13];
    char *cpu_name() { cpuid_reg reg = cpuid(0); (unsigned int&)_cpu_name[0] = reg.ebx; (unsigned int&)_cpu_name[4] = reg.edx; (unsigned int&)_cpu_name[8] = reg.ecx; _cpu_name[12]='\0'; return _cpu_name; }
     
     
    bool is_mmx_cpu          () { return (cpuid(1).edx & 0x00800000); }
    bool is_sse_cpu          () { return (cpuid(1).edx & 0x02000000); }
    bool is_sse2_cpu         () { return (cpuid(1).edx & 0x04000000); }
    bool is_sse3_cpu         () { return (cpuid(1).ecx & 0x00000001); }
    bool is_multithreaded_cpu() { return (cpuid(1).edx & 0x10000000); }
    unsigned int logical_cpu_count() { return is_multithreaded_cpu()?(cpuid(1).ebx>>16)&0xFF:1; }
     
    bool is_amd_cpu          () { return (cpuid(0x80000000).eax==0x80000000); }
    bool is_3dnow_cpu        () { return (cpuid(0x80000001).edx & 0x80000000); }
     
    unsigned int l1_cache_size() { cpuid_reg reg = cpuid(4,1); return (((reg.ebx>>22)&0x3FF)+1)*(((reg.ebx>>12)&0x3FF)+1)*((reg.ebx&0xFFF)+1)*(reg.ecx+1); }
    unsigned int l2_cache_size() { cpuid_reg reg = cpuid(4,2); return (((reg.ebx>>22)&0x3FF)+1)*(((reg.ebx>>12)&0x3FF)+1)*((reg.ebx&0xFFF)+1)*(reg.ecx+1); }
     
    #endif
    Essaye peut-être en premier lieu de commenter la ligne J'ai recompilé sans cette ligne:

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Voilà les nouveaux résultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    amd          	0
    mmx          	1
    sse          	1
    sse2         	1
    sse3         	1
    3dnow        	1
    multithreaded	1
    logical cpu  	2
    L1 cache     	1
    L2 cache     	1
    C'est mieux mais pas encore correct à 100% (a priori il reste le flag amd qui est incorrect, le reste est bon).

    Je viens de trouver le logiciel gratuit AMD CPUID qui donne les informations sur le CPU, je pense qu'il peut t'aider : il donne toutes les constantes, registres et bits correspondant à chaque fonctionnalité (pour processeurs AMD tout du moins).

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Le problème c'est que les instructions d'identification ne sont pas compatibles entre Intel et AMD. Je le savais, mais je pensais connaître suffisamment de différence.

    Le petit programme AMD_CPUID corrobore mes résultats sur mon CPU.
    Tu pourrais me donner les résultats de ce programme sur le tien s'il-te-plait.
    Développe toutes les arborescences. Fais peut-être une ou deux captures d'écran car c'est sûrement fastidieux de tout recopier.

    En fait les 2 dernières lignes de mon programme sont sensées donner la taille des mémoires caches. Mais il faut pour cela que le niveau 4 de cpuid soit implémenté dans le CPU.

    Et certes la 2ème version compilée marche mieux sur un AMD, mais j'ai supprimé un test de validité qu'il vaudrait mieux remettre. j'espère pouvoir corriger ça grâce a tes données.

Discussions similaires

  1. Réponses: 9
    Dernier message: 13/06/2005, 17h56
  2. Réponses: 4
    Dernier message: 29/11/2004, 16h51
  3. Comment retrouver les propriétés d'un fichier ?
    Par JuanLopez1966 dans le forum x86 32-bits / 64-bits
    Réponses: 1
    Dernier message: 01/09/2004, 16h34
  4. Informations sur un exe (dans les propriétés windows)
    Par SteelBox dans le forum Windows
    Réponses: 6
    Dernier message: 06/07/2004, 18h20
  5. [VBA] Les propriétés de cellule dans Excel
    Par Kylen dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 05/07/2004, 23h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo