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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Nombre de processeurs
    Bonjour,

    J'ai un bi processeur, mais quand j'utilise le code suivant proposé par windows je ne trouve pas mon second processeur (voir image)

    Nom : taches.png
Affichages : 604
Taille : 53,7 Ko

    Alors que le code mode donne:

    GetLogicalProcessorInformation results:
    Number of NUMA nodes: 1
    Number of physical processor sockets: 1
    Number of processor cores: 20
    Number of logical processors: 40
    Number of processor L1/L2/L3 caches: 40/20/1

    Merci d'avance de votre aide

    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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
     
    typedef BOOL (WINAPI *LPFN_GLPI)(
        PSYSTEM_LOGICAL_PROCESSOR_INFORMATION,
        PDWORD);
     
     
    // Helper function to count set bits in the processor mask.
    DWORD CountSetBits(ULONG_PTR bitMask)
    {
        DWORD LSHIFT = sizeof(ULONG_PTR)*8 - 1;
        DWORD bitSetCount = 0;
        ULONG_PTR bitTest = (ULONG_PTR)1 << LSHIFT;
        DWORD i;
     
        for (i = 0; i <= LSHIFT; ++i)
        {
            bitSetCount += ((bitMask & bitTest)?1:0);
            bitTest/=2;
        }
     
        return bitSetCount;
    }
     
    int _tmain ()
    {
        LPFN_GLPI glpi;
        BOOL done = FALSE;
        PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer = NULL;
        PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptr = NULL;
        DWORD returnLength = 0;
        DWORD logicalProcessorCount = 0;
        DWORD numaNodeCount = 0;
        DWORD processorCoreCount = 0;
        DWORD processorL1CacheCount = 0;
        DWORD processorL2CacheCount = 0;
        DWORD processorL3CacheCount = 0;
        DWORD processorPackageCount = 0;
        DWORD byteOffset = 0;
        PCACHE_DESCRIPTOR Cache;
     
        glpi = (LPFN_GLPI) GetProcAddress(
                                GetModuleHandle(TEXT("kernel32")),
                                "GetLogicalProcessorInformation");
        if (NULL == glpi)
        {
            printf("\nGetLogicalProcessorInformation is not supported.\n");
            return (1);
        }
     
        while (!done)
        {
            DWORD rc = glpi(buffer, &returnLength);
     
            if (FALSE == rc)
            {
                if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
                {
                    if (buffer)
                        free(buffer);
     
                    buffer = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)malloc(
                            returnLength);
     
                    if (NULL == buffer)
                    {
                        printf("\nError: Allocation failure\n");
                        return (2);
                    }
                }
                else
                {
                    printf("\nError %d\n", GetLastError());
                    return (3);
                }
            }
            else
            {
                done = TRUE;
            }
        }
     
        ptr = buffer;
     
        while (byteOffset + sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) <= returnLength)
        {
            switch (ptr->Relationship)
            {
            case RelationNumaNode:
                // Non-NUMA systems report a single record of this type.
                numaNodeCount++;
                break;
     
            case RelationProcessorCore:
                processorCoreCount++;
     
                // A hyperthreaded core supplies more than one logical processor.
                logicalProcessorCount += CountSetBits(ptr->ProcessorMask);
                break;
     
            case RelationCache:
                // Cache data is in ptr->Cache, one CACHE_DESCRIPTOR structure for each cache.
                Cache = &ptr->Cache;
                if (Cache->Level == 1)
                {
                    processorL1CacheCount++;
                }
                else if (Cache->Level == 2)
                {
                    processorL2CacheCount++;
                }
                else if (Cache->Level == 3)
                {
                    processorL3CacheCount++;
                }
                break;
     
            case RelationProcessorPackage:
                // Logical processors share a physical package.
                processorPackageCount++;
                break;
     
            default:
                printf("\nError: Unsupported LOGICAL_PROCESSOR_RELATIONSHIP value.\n");
                break;
            }
            byteOffset += sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION);
            ptr++;
        }
     
        printf("\nGetLogicalProcessorInformation results:\n");
        printf("Number of NUMA nodes: %d\n",
                numaNodeCount);
        printf("Number of physical processor sockets: %d\n",
                processorPackageCount);
        printf("Number of processor cores: %d\n",
                processorCoreCount);
        printf("Number of logical processors: %d\n",
                logicalProcessorCount);
        printf("Number of processor L1/L2/L3 caches: %d/%d/%d\n",
                processorL1CacheCount,
                processorL2CacheCount,
                processorL3CacheCount);
     
        free(buffer);
     
        return 0;
    }

  2. #2
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    Quel rapport avec le C++ ?
    (et même ton code , c'est du C et non du C++ ).

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    J'ai travaillé sur un code identique il y a quelques jours mais sans multiprocessor. Je m'attendrais à ce que ce soit le truc Numa qui donne le nombre de processeurs ?
    Sinon je ne sais pas quel API fournirait ça, et Google est assez avare en information...
    Par contre oui l'exemple fourni est en C et franchement médiocre.
    Tu peux appeler directement GetLogicalProcessorInformationEx, pas besoin de getprocaddress etc.
    Pour le buffer, un std::vector<uint8_t> fait l'affaire et remplace très bien le malloc.

    Peut-être qu'avec GetLogicalProcessorInformationEx et RelationAll tu auras de meilleurs résultats.
    https://devblogs.microsoft.com/oldne...028-00/?p=2823
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    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 de votre suggestion, malheureusement visiblement mon compilateur GCC (4.7.1) est visiblement trop vieux parce qu'il ne reconnait par GetLogicalProcessorInformationEX.

    Mon Qt (5.4.1) doit l'être aussi parce que la fonction QThread::idealThreadCount() répond 40 au lieu des 80 attendus

  5. #5
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 032
    Billets dans le blog
    12
    Par défaut
    Pour compter le nombre de coeurs logiques, j'utilise ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    uint32_t getCoreCount()
    {
    	SYSTEM_INFO sysinfo = { 0 };
    	::GetSystemInfo( &sysinfo );
    	return uint32_t( sysinfo.dwNumberOfProcessors );
    }
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  6. #6
    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,

    Oui essayé ca aussi sans plus de résultats probants

  7. #7
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    Citation Envoyé par uriotcea Voir le message
    Merci de votre suggestion, malheureusement visiblement mon compilateur GCC (4.7.1) est visiblement trop vieux parce qu'il ne reconnait par GetLogicalProcessorInformationEX.
    Je pense qu'il est vivement préférable d'utiliser la dernière version de Visual Studio.
    Après si ces API windows sont compliquées à utiliser avec Qt faire une dll à part qui appelle ces API windows

  8. #8
    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,
    Je n'utilise pas du tout visual studio et je préfère poursuivre avec GNU gcc. Cela dit, les API Windows ne sont absolument pas compliquées à utiliser avec Q, ce n'est pas le souci. Je suis tout de même surpris qu'il n'existe pas de méthode même avec un gcc ancien de détecter le nombre de processeur. Les machine bi-pro existe depuis des décennies.

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