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 :

Comment choisir un processeur ?


Sujet :

C++

  1. #1
    Membre très actif
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2011
    Messages
    457
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 457
    Par défaut Comment choisir un processeur ?
    Bonjour

    Comment peut-on lancer un programme codé en C++ plusieurs fois sur un serveur en choisissant chaque fois un processeur du serveur ? (Parallélisme)

    Merci par avance
    Cordialement

  2. #2
    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
    Salut,


    Biensur mais ce n'est pas si simple. tu n'a pas de méthode standard, mais OS spécific.
    Regarde du coté de
    SetThreadAffinityMask pour windows
    pthread_setaffinity_np pour linux

    pour les autres il faut regarder la documentation

  3. #3
    Membre très actif
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2011
    Messages
    457
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 457
    Par défaut
    Merci Astraya

  4. #4
    Membre très actif
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2011
    Messages
    457
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 457
    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
    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
      class Program
        {
            [DllImport("ntdll.dll", CharSet = CharSet.Auto)]
            public static extern uint NtGetCurrentProcessorNumber();
     
            static void Main(string[] args)
            {
     
                //Set affinity to first CPU
                //UIntPtr currentaffinity = ProcessorAffinity.SetThreadAffinity(0);
                //Console.WriteLine("Running on CPU #{0}", NtGetCurrentProcessorNumber());
     
                ////Restore last affinity
                //ProcessorAffinity.SetThreadAffinityMask(currentaffinity);
     
                //Cycle through all logical CPUs
                for (int cpuid = 0; cpuid < Environment.ProcessorCount; cpuid++)
                {
                    using (ProcessorAffinity.BeginAffinity(cpuid))
                    {
                        Console.WriteLine("Running on CPU #{0}", NtGetCurrentProcessorNumber());
                    }
                }
                Console.ReadLine();
     
            }
        }
        public static class ProcessorAffinity
        {
            static class Win32Native
            {
                //GetCurrentThread() returns only a pseudo handle. No need for a SafeHandle here.
                [DllImport("kernel32.dll")]
                public static extern IntPtr GetCurrentThread();
     
                [HostProtectionAttribute(SelfAffectingThreading = true)]
                [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
                public static extern UIntPtr SetThreadAffinityMask(IntPtr handle, UIntPtr mask);
     
            }
     
            public struct ProcessorAffinityHelper : IDisposable
            {
                UIntPtr lastaffinity;
     
                internal ProcessorAffinityHelper(UIntPtr lastaffinity)
                {
                    this.lastaffinity = lastaffinity;
                }
     
                #region IDisposable Members
     
                public void Dispose()
                {
                    if (lastaffinity != UIntPtr.Zero)
                    {
                        Win32Native.SetThreadAffinityMask(Win32Native.GetCurrentThread(), lastaffinity);
                        lastaffinity = UIntPtr.Zero;
                    }
                }
     
                #endregion
            }
     
            static ulong maskfromids(params int[] ids)
            {
                ulong mask = 0;
                foreach (int id in ids)
                {
                    if (id < 0 || id >= Environment.ProcessorCount)
                        throw new ArgumentOutOfRangeException("CPUId", id.ToString());
                    mask |= 1UL << id;
                }
                return mask;
            }
     
            /// <summary>
            /// Sets a processor affinity mask for the current thread.
            /// </summary>
            /// <param name="mask">A thread affinity mask where each bit set to 1 specifies a logical processor on which this thread is allowed to run. 
            /// <remarks>Note: a thread cannot specify a broader set of CPUs than those specified in the process affinity mask.</remarks> 
            /// </param>
            /// <returns>The previous affinity mask for the current thread.</returns>
            public static UIntPtr SetThreadAffinityMask(UIntPtr mask)
            {
                UIntPtr lastaffinity = Win32Native.SetThreadAffinityMask(Win32Native.GetCurrentThread(), mask);
                if (lastaffinity == UIntPtr.Zero)
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                return lastaffinity;
            }
     
            /// <summary>
            /// Sets the logical CPUs that the current thread is allowed to execute on.
            /// </summary>
            /// <param name="CPUIds">One or more logical processor identifier(s) the current thread is allowed to run on.<remarks>Note: numbering starts from 0.</remarks></param>
            /// <returns>The previous affinity mask for the current thread.</returns>
            public static UIntPtr SetThreadAffinity(params int[] CPUIds)
            {
                return SetThreadAffinityMask(((UIntPtr)maskfromids(CPUIds)));
            }
     
            /// <summary>
            /// Restrict a code block to run on the specified logical CPUs in conjuction with 
            /// the <code>using</code> statement.
            /// </summary>
            /// <param name="CPUIds">One or more logical processor identifier(s) the current thread is allowed to run on.<remarks>Note: numbering starts from 0.</remarks></param>
            /// <returns>A helper structure that will reset the affinity when its Dispose() method is called at the end of the using block.</returns>
            public static ProcessorAffinityHelper BeginAffinity(params int[] CPUIds)
            {
                return new ProcessorAffinityHelper(SetThreadAffinityMask(((UIntPtr)maskfromids(CPUIds))));
            }
     
        }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Choix] Processeur i5 ? i7 ? Double ou quad ? Comment choisir?
    Par derek corhs dans le forum Composants
    Réponses: 6
    Dernier message: 10/03/2010, 19h21
  2. [Lumières] Comment choisir les lumières à activer ?
    Par bigquick dans le forum OpenGL
    Réponses: 3
    Dernier message: 30/10/2004, 01h58
  3. Association : comment choisir le sens ?
    Par 1cado dans le forum Diagrammes de Classes
    Réponses: 2
    Dernier message: 26/09/2004, 23h12
  4. [JSP][Tomcat] COmment choisir la place des fichiers .class?
    Par mathieu dans le forum Tomcat et TomEE
    Réponses: 16
    Dernier message: 03/03/2004, 09h24
  5. Comment choisir une langue differente de la locale?
    Par julian_ross dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 01/03/2004, 18h08

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