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 :

Nombre de processeurs


Sujet :

C++

  1. #21
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    Bonjour,

    Merci pour toutes ces suggestions. Cependant je vois bien cette variable dans l'onglet "Variable d'environnement" de mon Windows, elle n'est pas présente en console tapant "echo &NUMBER_OF_PROCESSORS". C'est étrange.
    Enfin qu'importe de toute façon sa valeur définie dans le système est de 40 alors que je ne sais pas ce que cette variable représente exactement. Le nombre de cœurs (40) ou le nombre de processeur logique (80) ?

  2. #22
    Membre émérite
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 452
    Par défaut
    Bonjour

    et avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo %NUMBER_OF_PROCESSORS%
    (Sous Windows)?

    Cordialement

  3. #23
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    Salut,

    Manique ca marche, j'ai bien "80" à présent!
    Je ne serai pas en train de mélanger les commandes Linux et Windows

  4. #24
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    J'ai crié victoire trop tôt
    en console j'ai bien 80, mais en C (ci-dessous) j'ai 40

    JE COMPREND PLUS RIEN

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *n;
    n=getenv("NUMBER_OF_PROCESSORS");
    if (n!=NULL) printf("Nbr_proc = %s",n);

  5. #25
    Membre éclairé Avatar de Suryavarman
    Homme Profil pro
    Développeur 3D
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur 3D
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Par défaut
    mince.

    As tu accès à wdm.h ?

    https://docs.microsoft.com/en-us/win...processorcount


    Sinon tu peux essayer d’accéder au registre et chercher cette information:
    Ordinateur\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WOF\ProcessorCount

  6. #26
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    Non malheureusement pas de "wdm.h" pour moi
    Sinon, dans les registre la variable en question donne 40

  7. #27
    Membre éclairé Avatar de Suryavarman
    Homme Profil pro
    Développeur 3D
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur 3D
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Par défaut
    NUMBER_OF_PROCESSORS est bien une variable système ? Il n’ y aura pas une même variable en utilisateur ?

  8. #28
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    Ok news
    Si j'utilise le code ci-dessous j'ai bien '80'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define VARNAME TEXT("NUMBER_OF_PROCESSORS")
    #define BUFSIZE 4096
    TCHAR buf[BUFSIZE];
    DWORD dwRet = GetEnvironmentVariable(VARNAME, buf, BUFSIZE);
    Les mystères de Windows !!

  9. #29
    Membre éclairé Avatar de Suryavarman
    Homme Profil pro
    Développeur 3D
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur 3D
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Par défaut
    Bravo. Bien joué.

  10. #30
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Bonjour,

    tu dois utiliser GetLogicalProcessorInformationEx et pas GetLogicalProcessorInformation.
    Comme le dit la documentation:

    On systems with more than 64 logical processors, the GetLogicalProcessorInformation function retrieves logical
    processor information about processors in the processor group to which the calling thread is currently assigned. Use the
    GetLogicalProcessorInformationEx function to retrieve information about processors in all processor groups on the system.
    En gros, GetLogicalProcessorInformationEx retourne uniquement les informations concernant le processeurs sur lequel tourne ton process.

  11. #31
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    Oui merci effectivement je pense que "GetLogicalProcessorInformationEx" est la bonne solution, mais je n'y ai pas accès et ca me demanderai d'upgrade énormément de chose comme expliqué précédemment.

  12. #32
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Citation Envoyé par uriotcea Voir le message
    Oui merci effectivement je pense que "GetLogicalProcessorInformationEx" est la bonne solution, mais je n'y ai pas accès et ca me demanderai d'upgrade énormément de chose comme expliqué précédemment.
    Dans les files du dessus justement, je ne vois pas le rapport entre le compilateur et le fait que tu ne puisse pas "avoir" GetLogicalProcessorInformationEx.
    GetLogicalProcessorInformationEx est dans la dll Kernel32.dll. Rien a voir avec ton compilateur.
    La seule chose que tu as besoin c'est GetProcAddress et Kernel32.dll qui contient GetLogicalProcessorInformationEx.

    Tu peux être face à plusieurs problèmes:
    - Tu n'as pas GetProcAddress. Sachant que ça date de Windows XP... Je doute.
    - Tu n'as pas GetLogicalProcessorInformationEx dans Kernel32.dll. Sachant qu'il faut Windows 7 minimum... Je doute. mais pourquoi pas... Si tu es sur XP ou Vista ou 2000....
    - Tu as un problème dans l'utilisation de GetLogicalProcessorInformationEx et dans ce cas, il faut lire la documentation correctement et entièrement.

    Le compilateur n'a rien à voir dans ton problème.

    Oublie le truc de la variable d'environnement, on fait du C/C++ pas autre chose. La variable d'environnement peut changer d'un OS à l'autre et même être modifié, je peux très bien mettre 1000 dans la variable, ça ne change rien et je peux même faire crasher ton application voir pire... C'est juste un patch digne des étudiants et stagiaires. Tu as une API système à utiliser. Il faut réussir à l'utiliser.

    Tu es sur quel OS? Quel Version?
    Tu as essayer GetProcAddress pour récupérer GetLogicalProcessorInformationEx? Que ce passe-t-il? Quel message d'erreur?

  13. #33
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    Tes différentes remarques m'ont fait tiquer et finalement j'ai trouvé parmi mes fichier d'entête la ligne suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define _WIN32_WINNT 0x0500
    En remplaçant 0x0500 par 0x0602 (un Windows plus récent), j'ai finalement accès à la fonction "GetLogicalProcessorInformationEx" et je vais pouvoir l'utiliser

    Cela dit, ce n'est probablement pas si simple, cette variable est aussi positionnée à 0x500 par mon compiler gcc dans "_mingw.h" et il m'alerte sur ce point à la compilation

  14. #34
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Ok, 0x0500 c'est Windows 2000.
    Cela dit, changer le header système est une TRESSSSS mauvaise idée pour plein de raison.
    Si tu es bloqué avec ton GCC, sur Windows 2000 tu as GetProcAddress tout de même.
    Passe pas GetProcAddresset ne modifie pas ton header système. Ou mets à jour MinGW si tu veux passer par le header système qui te fournit GetLogicalProcessorInformationEx.

  15. #35
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    Oui, je suis assez d'accord sur ce point, ca me fait peur aussi de jouer à ca.
    Cela dit, si getProcAdress( me permet effectivement d'atteindre la fonction "GetLogicalProcessorInformationEx", j'ai testé, mais je n'ai pas accès à la structure "SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX" et d'autres probablement me permettant de l'exploiter.

  16. #36
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Citation Envoyé par uriotcea Voir le message
    Oui, je suis assez d'accord sur ce point, ca me fait peur aussi de jouer à ca.
    Cela dit, si getProcAdress( me permet effectivement d'atteindre la fonction "GetLogicalProcessorInformationEx", j'ai testé, mais je n'ai pas accès à la structure "SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX" et d'autres probablement me permettant de l'exploiter.
    Oui effectivement c'est un 2nd problème.
    Dans ce cas 2 choix:
    1- Mettre à jour MinGW
    2 - Déclarer toi même les structures, par chance elle sont dans la documentation et rien de tricky, c'est du C...
    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
     
    typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP {
      RelationProcessorCore,
      RelationNumaNode,
      RelationCache,
      RelationProcessorPackage,
      RelationGroup,
      RelationProcessorDie,
      RelationNumaNodeEx,
      RelationProcessorModule,
      RelationAll = 0xffff
    } LOGICAL_PROCESSOR_RELATIONSHIP;
     
    typedef struct _PROCESSOR_RELATIONSHIP {
      BYTE           Flags;
      BYTE           EfficiencyClass;
      BYTE           Reserved[20];
      WORD           GroupCount;
      GROUP_AFFINITY GroupMask[ANYSIZE_ARRAY];
    } PROCESSOR_RELATIONSHIP, *PPROCESSOR_RELATIONSHIP;
     
    ///ETC.....
    typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX {
      LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
      DWORD                          Size;
      union {
        PROCESSOR_RELATIONSHIP Processor;
        NUMA_NODE_RELATIONSHIP NumaNode;
        CACHE_RELATIONSHIP     Cache;
        GROUP_RELATIONSHIP     Group;
      } DUMMYUNIONNAME;
    } SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX;
    Mais bon...c'est pas du tout ce qu'il faut faire... Honnêtement, met a jour MingGW... :p

  17. #37
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    Oui effectivement j'ai commencé à me lancer là dedans, et c'est trop complexe, certaines structure existent déjà mais sous forme différente, j'ai renoncé.
    Une mise à jour semble effectivement l'unique solution

  18. #38
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    Il y a WMI qui donne des informations très détaillés sur le matériel (ou autre).
    Win32_Processor
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  19. #39
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    Bonsoir,

    J'ai creusé ce point, mais là clairement je suis dépassé.

  20. #40
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    #pragma comment(lib, "wbemuuid.lib")
    #pragma comment(lib, "comsuppw.lib")
     
     
    #ifndef _WIN32_DCOM
    #define _WIN32_DCOM
    #endif
     
     
    #include <windows.h>
    #include <objbase.h>
    #include <atlbase.h>
    #include <iostream>
    #include <wbemidl.h>
    #include <comutil.h>
     
     
    int main()
    {
        HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
        if (FAILED(hr)) return -1;
     
     
        hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT,
            RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
        if (FAILED(hr)) return -1;
     
     
        int result = 0;
        {
            CComPtr<IWbemLocator> locator;
            hr = CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL,
                CLSCTX_INPROC_SERVER, IID_IWbemLocator,
                reinterpret_cast< void** >(&locator));
            if (FAILED(hr)) return -1;
     
     
            CComPtr<IWbemServices> service;
            hr = locator->ConnectServer(L"root\\cimv2", NULL, NULL, NULL,
                WBEM_FLAG_CONNECT_USE_MAX_WAIT,
                NULL, NULL, &service);
            if (SUCCEEDED(hr))
            {
                CComPtr<IEnumWbemClassObject> enumerator;
                hr = service->ExecQuery(L"WQL", L"SELECT * FROM Win32_Processor",
                    WBEM_FLAG_FORWARD_ONLY, NULL, &enumerator);
                if (SUCCEEDED(hr))
                {
                    CComPtr<IWbemClassObject> processor = NULL;
                    ULONG retcnt;                 
                    hr = enumerator->Next(WBEM_INFINITE, 1L, reinterpret_cast<IWbemClassObject**>(&processor), &retcnt);
                    if (SUCCEEDED(hr))
                    {
                        for (ULONG i = 1; i <= retcnt; i++)
                        //if (retcnt > 0)
                        {
                            _variant_t var_val;
                            hr = processor->Get(L"NumberOfCores", 0, &var_val, NULL, NULL);
                            if (SUCCEEDED(hr))
                            {
                                _bstr_t str = var_val;
                                std::cout << "Nb cores : " << str << std::endl;
                            }
     
     
                            else result = -1;
                            hr = processor->Get(L"NumberOfLogicalProcessors", 0, &var_val, NULL, NULL);
                            if (SUCCEEDED(hr))
                            {
                                _bstr_t str = var_val;
                                std::cout << "Nb processeur logique : " << str << std::endl;
                            }
                            else result = -1;
                        }
                    }
                    else result = -1;
                }
                else result = -1;
            }
            else result = -1;
        }
        CoUninitialize();
     
     
        return result;
    }
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

Discussions similaires

  1. connaitre le nombre de processeur utilisés
    Par manue85 dans le forum AIX
    Réponses: 2
    Dernier message: 05/03/2008, 14h54
  2. Réponses: 4
    Dernier message: 01/05/2007, 10h37
  3. récupérer le nombre de processeur
    Par salseropom dans le forum C
    Réponses: 6
    Dernier message: 27/04/2007, 10h06
  4. Limite du nombre de processeurs & SQL 2005 Standard
    Par kingrvb dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/12/2006, 15h26

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