G4-CPU ziemlich langsam?!

hä??

Also ich weiß gar nicht was ihr habt.
Mein iBook mit 1 Ghz macht in Sachen "Arbeitsgeschwindigkeit" meinen P4 mit 2.53 Ghz auf jeden Fall was vor (Beide haben gleich viel RAM drin). Wie ich das herausgefunden habe??
Ganz einfach.
Mit der Windows Kiste starte ich einen Scanvorgang (1200dpi) und während des Scannens möchte ich nebenbei mal schnell bei Macuser surfen. Also klicke ich "während des Scanvorganges" auf das Internet Explorer Symbol :). Tja. Da vergeht schon einige Zeit, weil das System ja gerade scannt. Oder ich schiebe eine CD rein, bis die CD eingelesen ist (Einlesezeit) ist das System beschäftigt und verzögert sämtliche Arbeitsprozesse. Windows ist sobald es 2 oder mehr Aufgaben gleichzeitig ausführen soll, absolut überlastet.

Anders mein iBook (genauso wie bei Linux auch) - hier klick ich munter während des Scancvorganges auf andere Applikationen und *bum* *bum* poppt das Zeug auf. Und darauf kommt es mir persönlich drauf an. Damit kann ich arbeiten.

2. Beispiel: O. K. Ich arbeite mit ziemlich großen Dateien im Photoshop. Tja. Also unter Windows vergeht da schon eine kleine Ewigkeit wenn ich mal schnell in das Bild "reinzoome" oder einen neuen Verlauf integriere, Textebene erstelle etc. - beim iBook jedoch ohne Verzögerung.

PDF ist auch ein schönes Beispiel. Wenn ich meine Photoshop Dateien als .pdf exportiere und dann in den PDFs mal reinzoome - da steht die Windows Kiste stellenweise. (schon das Öffnen dauert) - und beim iBook - gehts halt einfach auf :)

Tja. Das ist jetzt meine eigene Erfahrung, aber was nützt mir ein 2,53 Ghz Prozessor, wenn ich mit nem 1 Ghz-Prozessor einfach schneller u. effizienter arbeiten kann??? Ich habe bei meinem iBook keine Probleme mit Geschwindigkeiten. Ingesamt habe ICH den Eindruck, das mein iBook die meiste Power hat, da ich hier am flüssigsten Arbeiten kann - ohne Stockungen etc.

Und nein, es liegt bestimmt nicht an meiner Windows-Kiste (hab nämlich mehrere ( auch nen AMD 1800+ ---> und es ist überall das selbe)

Auch in der Arbeit. Ein Windows-Rechner mit 2 Ghz - Katalog Erstellung mit Photoshop ---> eine Katastrophe. Auch das restliche Arbeiten ist damit sehr mühevoll.

Daher finde ich den Apple-Multiplikator bei den Ghz-Zahlen *2 gar nicht so verkehrt.

Ein bisher restlos Apple-begeisterter Jahres-Neu-Switcher :)

So long.
 
Also bei einem muss ich dir wirklich voll zustimmen, dass Arbeiten mit dem iBook geht wirklich flüssig von der Hand und so. Aber bei den meisten Benchmarks und so scheint der Apple etwas schlechter abzuschneiden...

Ich denke mal, dass das auch teilweise an der Optimierung des Codes liegt. Ich denke mal, dass man noch so das ein oder andere mehr heraus holen könnte, wenn man die Programme für den G4 optimieren würde.
 
@Alex24. das nennt man (funktionierendes) Multitasking ;)

mfg,
jay
 
Ich bin zwar kein C-Programmierer, ich denke aber auch, daß der Schlüssel in der Vektorisierung des Programms liegt (G4's Altivec-Einheit), so dies möglich sein sollte.
Wäre wirklich außerordentlich spannend, dann das Ergebnis auf dem iBook zu sehen.

Daß es am RAM liegt, kann ich mir nicht vorstellen.

No.
 
Faice schrieb:
Beispielsweise braucht mein iBook zur berechnung einer SETI@home Work Unit wesentlich länger als der Athlon XP 1600+.
Seti ist nicht auf den G4 optimiert. Seti hat sowieso zu viele Clients laufen, so viele, dass sie die Workunits teilweise doppelt verschicken. Daher besteht für Seti kein Bedarf, den Code zu optimieren.
Bei rc5 ist der Client voll auf Altivec optimiert, da werden die Workunits auf Deinen 1GHz-iBook so schnell berechnet, wie auf einem 5,5GHz Pentium4 (welchen es ja bekanntlich nicht gibt).

Es kommt immer drauf an, was gerechnet wird.
In der Festkomma-Bereich scaliert der G4 ungefähr, wie ein gleich getakteter x86, im Fließkommabereich siehts schon besser aus. Sobald die Altivec-Unit zum Tragen kommt, lässt der G4 den x86 hinter sich.
Beim Berechnen von Fraktalen kann man die Rechenleistung des G4 durch Abschalten der Altivec-Einheit auf ca. 1/4 reduzieren (bei Deinem 1GHz-iBook dürfte das sowas, wie etwas über 2Gflops vs. 500Mflops sein).
 
Faice schrieb:
Was sagt ihr dazu?

MfG

Faice

Iss doch klar. Schau dir mal an wieviel FPUs ein Athlon und ein G4 hat ;)
Die FPU des G4 ist zudem noch sehr bescheiden.

Der G4 rockt nur, wenn AltiVec im Spiel ist :)

Gruss
Kalle
 
Kompiliere das Programm bitte noch mal mit folgenden Flags:

-03 -fast -mcpu=7450 -faltivec -mabi=altivec -mtune=G4

Und teste dann bitte noch mal. :)
 
Ich betreibe Web-Entwicklung mit Java und lass den Kram auf Tomcat laufen.

Die Borland IDE ist auf meienn P4 2,8 GHz mit 1 GB RAM etwas schneller als auf meinem Powerbook G4 1,5 GhZ mit 1 GB RAM, aber sobald der Kram auf dem Tomcat als Anwendung läuft, sagt mein lahmer G4 dem P4 tschüss ... :)
 
Intel Pentium 3 mit 933 MHz: 99 s
PB 12" G4 1,33 GHz: 39 s

Die Parameter von Nuke brachten immerhin 1-2 Sekunden :)

gishmo schrieb:
Ich betreibe Web-Entwicklung mit Java und lass den Kram auf Tomcat laufen.

Die Borland IDE ist auf meienn P4 2,8 GHz mit 1 GB RAM etwas schneller als auf meinem Powerbook G4 1,5 GhZ mit 1 GB RAM, aber sobald der Kram auf dem Tomcat als Anwendung läuft, sagt mein lahmer G4 dem P4 tschüss ... :)
Bei interpretierten Sachen und vor allem Java sagt das imho nicht wirklich viel aus.

Ciao
 
Zuletzt bearbeitet:
Danke für die Links!

Ich werde mich in nächster Zeit mal da ran machen. Das mit dem Optimieren für den G4 gefällt mir.
 
Wenn ich nur wüsste wie man mit der Altivec-Einheit umgeht. Das Einzige was ich bisher geschafft habe, ist 2 Vectoren zu addieren/subtrahieren und das Ergebnis auszugeben.

Verzweifle aber an dem Auslesen von einer Zahl(Vector enthält 4) aus dem Vector und einfach andere Mathematische Operationen (Mal, Geteilt, etc.).
 
Schnellerer Code

Hallo,

Also ich hab den Code jetzt mal etwas optimiert. Ich weiß nicht, ob das speziell für den G4 ist oder so, aber ist bedeutend schneller! Ich werde den Code dann auch mal auf meinem anderen Rechner mit Athlon 1600+ testen. Mal schaun, ob er dort auch so abgeht.

Hier mal der neue Code:
Code:
#include <stdio.h>
// #include <math.h>
#include <time.h>

long	n = 1, ergexp = 0;
double	erg = 1, xxx2=0;
int	starttime = 0, endtime = 0, x=1, xxx=0;

inline void nlog(int x);

int main()
{
	printf("Geben Sie die Zahl ein dessen Fakultaet bestimmt werden soll: ");
	do
	{
		scanf("%ld", &n);
	}
	while(n<0);

	starttime=(int)time(NULL);
	for(x=1; x<=n; x++)
	{
		erg*=x;
		// ergexp+=(int)log10(erg);
		// erg/=pow(10, (int)log10(erg));
		nlog(erg);
		ergexp += xxx;
		erg *= xxx2;
	}
	endtime=(int)time(NULL);
	printf("\n Das Ergebnis lautet: %f*10^%ld\n", erg, ergexp);
	printf("Die Berechnung hat %i Sekunden benoetigt\n", (endtime-starttime) );
	return 0;
}

inline void nlog(int x)
{
	if (x >= 1000000000) 
	{
		xxx = 9;
		xxx2 = 1e-09;
	}
	else if (x >= 100000000) 
	{
		xxx = 8;
		xxx2 = 1e-08;
	}
	else if (x >= 10000000) 
	{
		xxx = 7;
		xxx2 = 1e-07;
	}
	else if (x >= 1000000) 
	{
		xxx = 6;
		xxx2 = 1e-06;
	}
	else if (x >= 100000) 
	{
		xxx = 5;
		xxx2 = 1e-05;
	}
	else if (x >= 10000) 
	{
		xxx = 4;
		xxx2 = 1e-04;
	}
	else if (x >= 1000) 
	{
		xxx = 3;
		xxx2 = 1e-03;
	}
	else if (x >= 100) 
	{
		xxx = 2;
		xxx2 = 1e-02;
	}
	else if (x >= 10) 
	{
		xxx = 1;
		xxx2 = 1e-01;
	}
	else if (x >= 1) 
	{
		xxx = 0;
		xxx2 = 1;
	}

}

Das ganze habe ich mit den gcc optionen -O3 -fast -mcpu=7450 -faltivec -mabi=altivec -mtune=G4 -framework vecLib kompiliert.

Mit dem alten Code habe ich zur berechnung von 50.000.000 noch 55 Sekunden gebraucht.
Mit dem neuen Code nur noch 5 Sekunden! Wenn das mal keine verbesserung ist.

Wenn jemand Lust hat, kenn er gerne mal versuchen, ob er noch mehr zum optimieren hinbekommt. Würde mich mal interessieren, ob da noch mehr geht.
 
Hi.

Naja. Optimieren...., du schummelst ja nur. ;)

Kleiner Scherz. Der Code ist ja jetzt schneller, da du ja anscheinend die log10-Funktion "umgangen" hast.

Ein Fehler beim alten Code war ja schon das du "(int)log10(erg)" 2 mal errechnet hast. Einmal reicht doch.

Den ganzen Altivec-Kram kannst du aus deinen Compiler-Flags entfernen. Wie oben schon gesagt, bringt das rein gar nix. Du musst schon Alitvec-Code schreiben damit das was wird. ;)

Das ganze in Altivec würde ungefähr so ablaufen:

Jetzt rechnest du ja einfach hoch. Also 1*2*3*4*... nacheinander. Geht ja auch so nicht anders.

Altivec kann aber 4 Berechnungen auf einmal durchführen. Eine Vector-Variable kann 4 Werte aufnehmen. Also z.B.:

Vector1 hat die Werte 1 2 3 4.
Vector2 hat die Werte 5 6 7 8.

Vector3 enthält durch Multiplikation nun 5 12 21 32.

Wie gesagt das passiert alles in einem Schleifen-Durchgang. Jetzt könnte man immer so weiter rechnen bis alle Werte abgearbeitet sind (aber immer den kompletten Vector auffüllen am Ende, richtigerweise mit 1). Dann muss man nur noch die Vector-Werte ansich multiplizieren. Also im oberen Beispiel: 5*12*21*32.

Leider habe ich keine Ahnung wie das geht. ;) Aber damit bräuchte man nur ein viertel der Zeit, als mit deinem Code. :)
 
Haettest du Lust die Fakultaet mal rekursiv zu implementieren?

Verbraucht dann natuerlich sehr viel Speicher, aber wies mit der Geschwindigkeit aussieht weiss ich nicht.
 
Ich habe das Programm gerade mal mit einem Profiler (Shark) untersucht. Wie zu erwarten verbringt das Programm 90% seiner Zeit in den Bibliotheksfunktionen für log10 und pow. Daher wird eine Optimierung durch Compilerflags nichts bringen können.

Wenn der Athlon also schneller ist, liegt es sowohl am Prozessor als auch an den Mathe-Bibliotheken des jeweiligen Betriebsystems.

Übrigens: Diese Fakultätsberechnung hier ist für eine AltiVec-Optimierung ziemlich ungeeignet, weil sie kaum parallelisierbar ist (jede Schleifeniteration hängt von der Vorherigen ab) -- außer, man rechnet vier verschiedene Fakultäten gleichzeitig.
 
blutfink schrieb:
Übrigens: Diese Fakultätsberechnung hier ist für eine AltiVec-Optimierung ziemlich ungeeignet, weil sie kaum parallelisierbar ist (jede Schleifeniteration hängt von der Vorherigen ab) -- außer, man rechnet vier verschiedene Fakultäten gleichzeitig.

Wieso? Faktoren kann man doch tauschen wie man will.

Wie ich oben beschrieben habe, könnte man 1 2 3 4 nehmen um parallel mit 5 6 7 8 multiplizieren. Dann das Ergebnis zum Schluss untereinander rechnen, bzw. Zwischensummen bilden, wegen dem Integer-Überlauf...
 
-Nuke- schrieb:
Wieso? Faktoren kann man doch tauschen wie man will.

Faktoren schon, die in diesem Programm benötigten Operationen jedoch nicht.

-Nuke- schrieb:
Wie ich oben beschrieben habe, könnte man 1 2 3 4 nehmen um parallel mit 5 6 7 8 multiplizieren. Dann das Ergebnis zum Schluss untereinander rechnen, bzw. Zwischensummen bilden, wegen dem Integer-Überlauf...

Ah, verstehe ich dich richtig, dass du (abgesehen von der Parallelisierung) den obigen Algorithmus ersetzen willst durch eine direkte Berechnung 1*2*3*4*... ?

Das hilft dir leider nur bei sehr kleinen Fakultäten (AltiVec-Floats können nur bis etwa 10^38 < 34! . Der Kniff des obigen Algorithmus ist, dass die Fakultät nur näherungsweise bestimmt wird (mit der Genauigkeit der Funktionen log10 und pow), dafür aber recht schnell und für große Argumente.
 
blutfink schrieb:
Das hilft dir leider nur bei sehr kleinen Fakultäten (AltiVec-Floats können nur bis etwa 10^38 < 34! . Der Kniff des obigen Algorithmus ist, dass die Fakultät nur näherungsweise bestimmt wird (mit der Genauigkeit der Funktionen log10 und pow), dafür aber recht schnell und für große Argumente.

Wird doch oben auch nicht anders gemacht mit erg*=x;

Jedoch wird erg unten noch beschnitten. Aber ich habe im Altivec-Tutorial gelesen das Apple in der VecLib noch Altivec-Derivate für pow, sin, cos, usw. hat.

Vielleicht sollte man sich da noch mal umgucken?
 
irgendwie interessant

der selbe code kompiliert mit vs. net ausgeführt auf einer 1.6ghz centrino dose unter winxp (jetzt schreien sicher viele uaaaaah!) :D

E:\>test
Geben Sie die Zahl ein dessen Fakultaet bestimmt werden soll: 50000000

Das Ergebnis lautet: 2.345380*10^363233780
Die Berechnung hat 7 Sekunden benoetigt

E:\>test
Geben Sie die Zahl ein dessen Fakultaet bestimmt werden soll: 100000000

Das Ergebnis lautet: 1.617204*10^756570556
Die Berechnung hat 15 Sekunden benoetigt


Dann der neue code:


E:\>testneu
Geben Sie die Zahl ein dessen Fakultaet bestimmt werden soll: 50000000

Das Ergebnis lautet: 2.345380*10^363233780
Die Berechnung hat 2 Sekunden benoetigt
 
Zurück
Oben Unten