C PC auslasten und rechnen lassen.

A

Adam Gontier

Gast
Hi,
also wir haben in der Schule ganz frisch mit der Programmiersprache C angefangen, ich bin zwar noch ein Anfänger, aber ich wollte wissen, wie es in etwa aussehen sollte, wenn man seinen PC eine Aufgabe rechnen lassen soll, beispielsweise Pi oder die Wurzel aus 2.
Hier ist zum Beispiel das was wir gerade in der Klasse erreicht haben(anhang).

Ich hoffe ihr könnt mir ein paar passende Befehle geben, damit ich daran weiter ausprobieren und lernen kann.

Anhang anzeigen 153215

Ach ja, noch was:
Wie benutzen in der Schule Windows 2000 und Borland C++ Builder 6 Professional, ich benutze die Testversion von Dreamweaver CS4 und Bloodshed Dev-C++ unter XP und bald unter Win 7.
 
Zuletzt bearbeitet:
Wäre villeicht nicht schlecht wenn du von deinem Programm auch den Source Code veröffentlichst.

Naja das berechnen von PI ist nicht ganz so einfach wie man sich das vorstellt.
Das Problem ist, dass es keinen Datentyp gibt der mehr als 16 Nachkommastellen speichern kann.
Mögliche Alternativen wären dann entweder ein eigener Datentyp oder die Berechnung von einzelnen Stellen von PI.
Wobei das ganze dann für Anfänger etwas zu kompliziert ist.
Für die Wurzel von 2 gilt natürlich das gleiche.

Wenn du den PC auf 100% Auslastung bringen willst musst du auch einiges beachten.
Angenommen du lässt den PC einfach irgend etwas rechnen, eine Endlosschleife würde dazu auch schon ausreichen, dann wäre die Auslastung für einen Singe-Core Prozessor bei 100%, bei einem Dual-Core bei 50% und bei einem Quad-Core wie man sich denken könnte bei 25%.
Du müsstest also jeden Kern einzeln auslasten.
Das könnte man zB durch Threads realisieren, wobei man dann einfach so viele Threads wie Kerne erstellt und alle eine Endlosschleife oder ähnliches berechnen lässt, dann wäre die Auslastung bei 100%.
Das ganze ist aber auch nicht gerade das einfachste.

Du siehst also, dass selbst die wie es scheint einfachsten Sachen, oft gar nicht so einfach sind.

Gruß
BlackMark
 
Threads in C
Wenn man Threads C googled kommt schon einiges bei raus ^^ Sie zu öffnen und zu schließen ist auch nicht schwer... Sie allerdings synchron anzuwenden ist ne andere Geschichte (zB wird der Thread, der auf dem selben Core wie Windows läuft, für die gleiche Aufgabe wie die anderen Threads wohl länger brauchen...).
 
Wenn man eine heutige CPU wirklich auslasten will um z.B. die Stabilität zu prüfen, dann reichen solche Sachen schon lange nicht mehr aus. Zunächst einmal muss die CPU auf jeden Fall im x64 Modus laufen, da nur damit der volle Registersatz und die vollen Recheneinheiten verwendet werden können. Außerdem muss man darauf achten, dass die Integer-Recheneinheiten und die FPU gleichmäßig ausgelastet werden. Dabei sollte möglichst wenig RAM-Zugriff sein: so viel wie möglich muss aus dem Cache der CPU laufen. Selbst wenn man das alles so macht, dann ist ein großer Teil der CPU noch nicht ausgelastet. Erweiterungen wie MMX oder SSE sind nämlich sehr CPU spezifisch und zum Auslasten dieser kommt man ohne Assembler nicht weit.
 
Eigentlich ist das ja Schade.
Wir hatten gerade über irreparable Zahlen geredet und Pi und die Wurzel aus 2 waren dabei.
Dann sind ja SuperPi und Prime95 auch sehr komplizierte Programme?

Hier nochmal der Code:
Code:
#include<stdio.h>
main()
{
	float a,b;
	printf("Bitte geben Sie den Betrag in Euro ein: ");
	scanf("%f", &a);
	printf("Bitte geben Sie den Faktor ein: ");
	scanf("%f", &b);
	printf("\n%.2f Euro entsprechen", a);
	printf(" %.2f Euro in Fremdwaehrung.", a*b);
	scanf("%.2f", &a);
	scanf("%.2f", &b);
	getchar();
}
 
Adam Gontier schrieb:
Dann sind ja SuperPi und Prime95 auch sehr komplizierte Programme?
Beide sind zumindest für einen Anfänger relativ kompliziert. Das Hauptproblem besteht dabei - wie bereits von BlackMark angesprochen - bei den Datentypen: standardmäßig unterstützt kaum ein Compiler Datentypen größer 64 Bit. Eine 64 Bit Fixed-Point Zahl reicht gerade mal für ca. 20 Nachkommastellen aus (und das auch nur zum Darstellen der Zahl, bei vielen mathematischen Operation verliert man z.T. die Hälfte der Bits). Für einen Anfänger ist allein die Fixed-Point Arithmetik bereits relativ kompliziert - und die Simulation der riesigen Datentypen macht es sicherlich nicht einfacher.

Außerdem sind sowohl SuperPi als auch Prime95 nicht in der Lage, eine CPU vollständig auszulasten - allerdings machen beide Programme es relativ gut. Ich hab aber auch schon viele Rechner gesehen, die zwar in Prime95 stabil waren, aber im normalen Einsatz dann eben doch nich 100% Stabilität hatten.
 
Adam Gontier schrieb:
Wir hatten gerade über irreparable Zahlen geredet ...

Sind die kaputt ... oder meinst Du etwa irrationale Zahlen?


Btw: man sollte nicht einfach anzunehmen, dass bei n Threads mit Endlosschleife bei einer CPU mit n Kernen eine Auslastung von 100% entsteht - das würde voraussetzen, dass der Scheduler alle Threads gleichmäßig auf die Kerne verteilt.
 
Ich schließe mich XunnD an, bei den Threads ist das scheduling, sprich das zeitliche einteilen, welcher Thread wieviel Rechenzeit bekommt nicht so ohne weiteres zu beeinflußen. Da z.B. Windows und die Unix Derivate ausgefeilte Techniken einsetzen um ein Multithreading zu ermöglichen, dürfte es aus meiner Sicht heutzutage nicht möglich sein eine CPU mit einem eigenen Programm zu 100% auszulasten. Es gibt in modernen Betriebssystem viele Prozesse, die im Hintergrund laufen und von der Priorität wesentlich höher eingestuft werden, sodaß ein User-Prozess, z.B. das eigene Programm nicht wirklich 100% der CPU zur Berechnung erhält. Im übrigen würde ich dem Taskmanager von Windows und ähnlichen Programmen nicht als Referenz zur aktuellen Belastung der CPU sehen, da diese Programme ebenfalls Rechenzeit benötigen um die aktuelle Belastung zu berechnen bzw. darzustellen.

Anders sieht es bei DOS aus. Da gab es nur den einen Prozess, es wäre sicher möglich eine 100% Auslastung durch das eigene Programm zu erreichen, aber selbst da müssen, wie Simpson474 schrieb, Hardwarespezifische Eigenheiten berücksichtigt werden, Register, CPU, FPU, Cache, MMX, 3DNow, SSE um nur einige zu nennen... Das bedeutet eine Hardware nahe Programmierung, Assembler wäre das Stichwort, die von den meisten höheren Sprachen gar nicht oder nur mit extremen Kunststücken nur teilweise erreicht werden könnte, vielleicht wäre es, wenn überhaupt, nur durch C/C++ zu erreichen.
 
Zuletzt bearbeitet:
@XunnD & Rossibaer: Und ihr seit euch auch ganz sicher, dass das für einen C Anfänger von bedeutung ist?
Ihr habt natürlich vollkommen recht, aber das dürfte für einen C Anfänger doch relativ irrelevant sein, oder?

Gruß
BlackMark
 
Hi BlackMark, das ich da etwas ausführlicher geantwortet habe, liegt daran das die recht einfache Frage, sprich die Auslastung des Rechners, ein sehr komplexes Thema ist. Kurz hätte man einfach nur schreiben können: Nein, geht nicht. Das ist aber nur die halbe Wahrheit. Und hätte auch die Frage aufgeworfen, warum es nicht geht. Im übrigen war deine 1. Antwort auch recht umfangreich. ;-) Aber wie mit vielen Dingen verhält es sich so, das das was man kennt recht detailliert und umfangreich beschreibt. Liegt in der Natur.

Und Adam, entschuldige bitte, wenn die Informationen dieses Threads, zu viel und umfangreich sind. Es wird sicher eines Tages so sein das du verstehen wirst, wovon wir hier gesprochen haben. Bis dahin üben, üben üben. Es wird sich eines Tages bezahlt machen. Zurück zu deiner Frage: Also die Zahl PI als solche ist eine transzendente Zahl, d.h. sie ist irrational und nicht durch einen irgendwie gearteten Bruch, Wurzeln und ganzen Zahlen darstellbar. Die Verfahren, die es gibt, bilden nur eine Näherung an die tatsächliche Zahl PI ab, haben aber stets Abweichungen von der Zahl PI in den einzelnen Werten der Dezimalstellen. Für das "Berechnen" der Zahl PI gibt es sehr viele Verfahren, die alle auf die unterschiedlichste Art und Weise programmiert werden können. An deiner Stelle würde ich bei Wikipedia schauen, was du zu dem Thema PI und deren Berechnungsverfahren findest. Am Ende ist es reine Mathematik, die du dann auf einfache Rechenoperationen zurück führen könntest. Schau am besten mal auf folgenden Link http://de.wikipedia.org/w/index.php?title=Kreiszahl&section=17#Programm

Darunter findest du auch eine statistische Berechnung in C/C++ Syntax.
 
Zuletzt bearbeitet:
@XunnD :
Genau, irrationale Zahlen:D

@ Rest:

Ich habt bestimmt Recht damit, dass ich es irgendwan verstehen werde und das mir das sehr nützlich sein wird.

Ich werde mir einfach eue Links anschauen und üben üben üben.
 
Hm, vieles was hier gepostet wurde hat zwar seine Richtigkeit, aber meint ihr nicht, dass dies etwas zu weit führt? Die Standardaufgaben bei der Einführung mathematischer Berechnungen in Programmiersprachen wie C/C++ & Co. sind doch wohl Rekursion/Iteration in Verbindung mit den gängigen Algorithmen wie Hofstätter, Ackerman, Fibonacci (hoffe alle richtig geschrieben) und deren Reihenentwicklung. Wie die SSE3 & Co auslasten, dazu reichen meine Kentnisse lange nicht aus, aber mit sowas sollte man mMn nichtmal fortgeschrittenere Anfänger belasten.
 
http://de.wikipedia.org/wiki/Kreiszahl

hier gibts ne menge formeln die man implementieren kann um tatsächlich pi auszurechnen (war unsere einführungsaufgabe in der programmentwicklung in c)

über linux ist pi als konstante im math.h header mit drin unter win soviel ich weiss leider nicht

viel erfolg noch bei deiner umsetzung
 
damon6 schrieb:
über linux ist pi als konstante im math.h header mit drin unter win soviel ich weiss leider nicht

Soweit ich mich erinnere gibt es Pi als Konstante im Dev-C++ auch, ebenso über #include<math.h> zu nutzen.

Borland's C++ Builder hatten wir in der Schule auch auf Win 2000, das waren noch Zeiten, kurz nach den Turbo Pascal im Dos Zeiten.

Wenn du demnächst auf Windows 7 umsteigen willst, sei aber gewarnt dass seit Vista die guten alten chm Hilfedateien, also auch die von Dev-C++ Hilfe nicht mehr funktionieren, unter dem XP Modus von 7 hab ich es noch nicht getestet. Auch weiß ich nicht ob Borland Builder unter Vista/7 noch läuft, würde ich erstmal parallel testen.
 
@ MopedTobias
Seh ich auch so. Ein Grundbestandteil meiner Ausbildung ist C. Und alles, was darüber hinaus geht, mehr als einen Kern mit mehr als einfachen mathematischen Aufgaben zu belasten, ist schon mehr als Anfänger. Aber WENN man einen Dual/Quadcore voll auslaten will, kommt man um Threads nicht herum. Und das alles andere mit den Befehlserweiterungssätzen à la SSE etc kenn ich eh net :p Wird wohl auch nicht ganz einfach sein, so etwas speziell anzusprechen.
 
Ich vermute ohnehin, dass der TS C nur zur Einführung im Unterricht lernt (eignet sich mMn auch gut für die Grundlagen) und früher oder später auf ein Framwork umsteigen wird. .Net oder JDK verzeichen einem eher Fehler und Threading ist da jetzt auch nicht gerade kompliziert.
 
Zurück
Oben