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.
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 CreateThreadA 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;