Wieso haben alle Schleifen bei maximaler Iteration...



  • nur eine CPU auslastung von ~50%? Egal, wie ich Programmiere, ich komme nie auf eine höhere Auslastung... Liegt das daran, dass nicht alle Kerne meines CPUs belastet werden? (Habe eine Dual-Core CPU)

    Danke.



  • Ja.



  • volkard schrieb:

    Ja.

    Und wie kann ich bei einem Programm beide Kerne belasten?



  • HELPVISTAWIN7 schrieb:

    volkard schrieb:

    Ja.

    Und wie kann ich bei einem Programm beide Kerne belasten?

    Indem Du zwei Threads in einem Programm benutzt. Ist aber noch nicht in Standard-C++ dabei.
    Win32: CreateThread, _beginthread,
    linux: pthread_create, fork
    boost: bost::thread
    Winforms: Backgroundworker
    .Net: System::Threading::Thread
    Compilermagie: openmp
    usw...



  • volkard schrieb:

    HELPVISTAWIN7 schrieb:

    volkard schrieb:

    Ja.

    Und wie kann ich bei einem Programm beide Kerne belasten?

    Indem Du zwei Threads in einem Programm benutzt. Ist aber noch nicht in Standard-C++ dabei.
    Win32: CreateThread, _beginthread,
    linux: pthread_create, fork
    boost: bost::thread
    Winforms: Backgroundworker
    .Net: System::Threading::Thread
    Compilermagie: openmp
    usw...

    Verstehe. Danke!



  • HELPVISTAWIN7 schrieb:

    volkard schrieb:

    HELPVISTAWIN7 schrieb:

    volkard schrieb:

    Ja.

    Und wie kann ich bei einem Programm beide Kerne belasten?

    Indem Du zwei Threads in einem Programm benutzt. Ist aber noch nicht in Standard-C++ dabei.
    Win32: CreateThread, _beginthread,
    linux: pthread_create, fork
    boost: bost::thread
    Winforms: Backgroundworker
    .Net: System::Threading::Thread
    Compilermagie: openmp
    usw...

    Verstehe. Danke!

    bezweifel ich



  • Du kannst schlecht einen 'Programmlauf' auf zwei Cores verteilen. Da würden die ganze zeit Fehler auftreten, da das ding nicht synchron läuft.

    Wie gesagt, unter Windows benutzt du dann die WinAPI, unter Mac und Linux POSIX. Boost bietet eine gute portable threading library an.

    Wikipedia

    Oder in einem Forum gefunden:

    EDIT:
    Die Sleep(..); Anweisungen wird die CPU-Auslastung verhindern.

    #include <windows.h>
    #include <stdio.h>
    
    DWORD WINAPI MyThreadSagWasAndauernd(LPVOID parameter)
    {
       // parameter wird in diesem Beispiel nicht genutzt
       while(true)
       {
          printf("was...\n");
          Sleep(1000);
       }
    }
    
    int main()
    {
       // Starte einen Thread:
       // EDIT: zu CreateThread guck mal zwei Posts weiter bei Vicious Falcon
       CreateThread(NULL, 0, MyThreadSagWasAndauernd, NULL, 0, NULL);
       // Kurz warten...
       Sleep(500);
       // Und noch eine Endlosschleife:
       while(true)
       {
          printf("anderes...\n");
          Sleep(1000);
       }
    }
    


  • @lk das Sleep wird das mit der CPU auslastung verhindern



  • Mit OpenMP kann man eine for Schleife ganz leicht aufteilen.

    #pragma omp parallel for
    for (int i = 0; i < 1000; ++i) {
      a[i]= 2 * i;
    }
    


  • lk schrieb:

    printf("was...\n");
    

    und

    CreateThread(NULL, 0, MyThreadSagWasAndauernd, NULL, 0, NULL);
    

    Ist printf nicht eine Funktion aus der CRT?
    Es gibt wirklich viele Probleme, wenn man mit CreateThread einen Thread startet, der Funktionen der CRT nutzt. Das Problem ist, dass man andauernd denkt, mit der Synchronisation laufe irgendetwas falsch.
    Wenn man Funktionen der CRT in einem Thread nutzen möchte, dann sollte _beginthread(ex) verwendet werden. Steht auch in der Beschreibung von CreateThread

    A thread in an executable that calls the C run-time library (CRT) should use the _beginthreadex and _endthreadex functions for thread management rather than CreateThread and ExitThread;


Anmelden zum Antworten