Eine Woche Programmierwettbewerb: Rechtecke
-
über threads haben wir noch gar nicht gesprochen....
sollen wir einfach mal von einer maschine mit mehreren kernen ausgehen?
oder als parameter?
jenz
-
jenz schrieb:
über threads haben wir noch gar nicht gesprochen....
sollen wir einfach mal von einer maschine mit mehreren kernen ausgehen?
oder als parameter?
jenz
Nein, für den Wettbewerb hast du nur einen Prozessor.
Wenn du möchtest, kannst du jedoch deinen Code außer Konkurrenz multithreaded machen, und ich lass es mal auf bis zu 8 Prozessoren laufen. Dann muss es aber auf PThreads oder Qt Threads basieren.
-
lieber nicht, wenn du nicht gerade die selbe maschine hast, ist das verhalten sehr zufaellig. was bei einer mit mehreren threads super laufen kann wird dir bei einer anderen maschine das genick brechen... und wie gesagt, das ist random.
-
ok, da das mit dem vergleichen irgendwie net klappt(rapsos gepostete datei lässt leider meinen algo beim kopieren ins result array abstürzen), update ich einfach mal meinen letzten wert:
Seed:6432567
Ebene: 4096x4096
Anzahl: 15000000alter Wert(seite 4): 2min 45sec
neuer Wert: 14secanbei post ich nochmal die datei, mit der ich teste:
#include <iostream> #include <ctime> #include <vector> struct Rectangle { short minx; short maxx; short miny; short maxy; }; const int rectCount= 15000000; const int seed = 6432567; const Rectangle plane ={0,100,0,100}; class CTwister { static int m_Seed; public: static void Init(int Seed){m_Seed=Seed;} static int Rand() { m_Seed ^= (m_Seed>>11); m_Seed ^= (m_Seed<< 7)&0x9d2c5680UL; m_Seed ^= (m_Seed<<15)&0xefc60000UL; return (m_Seed^(m_Seed>>18)); //frac to 12bit? } }; int CTwister::m_Seed; void generate_rectangles(Rectangle plane,std::vector<Rectangle> &rectangles) { const int width = plane.maxx-plane.minx; const int height = plane.maxy-plane.miny; rectangles.resize(rectCount+1); rectangles[0] = plane; for(int i=0;i<rectCount;i++) { Rectangle &r = rectangles[i+1]; r.minx = CTwister::Rand()%(2*width)-(width/2); r.maxx = r.minx+CTwister::Rand()%(2*width)+1; r.miny = CTwister::Rand()%(2*height)-(height/2); r.maxy = r.miny+CTwister::Rand()%(2*height)+1; } } //vergleich Algo void algorithmTest(Rectangle plane, std::vector<Rectangle> const & rectangles, std::vector<std::vector<std::size_t> > & result) { for(int i=0;i!=rectangles.size();++i) { for(int x=rectangles[i].minx;x<rectangles[i].maxx;++x) { for(int y=rectangles[i].miny; y<rectangles[i].maxy; ++y) { if((x>=plane.minx) &&(x<plane.maxx) &&(y>=plane.miny) && (y<plane.maxy)) { result[x-plane.minx][y-plane.miny]=i; } } } } } void algorithm(Rectangle plane, std::vector<Rectangle> const & rectangles, std::vector<std::vector<std::size_t> > & result) { //schreibt da euren Algo rein } int main() { CTwister::Init(seed); std::vector<Rectangle> rects; generate_rectangles(plane,rects); std::vector<std::vector<std::size_t> > result(plane.maxx-plane.minx,std::vector<std::size_t>(plane.maxy-plane.miny)); std::vector<std::vector<std::size_t> > result2(plane.maxx-plane.minx,std::vector<std::size_t>(plane.maxy-plane.miny)); std::cout<<"start "; std::clock_t start=std::clock(); algorithm(plane,rects, result2); std::clock_t end=std::clock(); std::cout<<(end-start)/(CLOCKS_PER_SEC/1000)<<"\n"; std::cout<<"starting Default algo "; start=std::clock(); algorithmTest(plane,rects, result); end=std::clock(); std::cout<<(end-start)/(CLOCKS_PER_SEC/1000)<<"\n"; int fehler=0; for(std::size_t i=0;i<result.size();++i) { for(std::size_t j=0;j<result[i].size();++j) { fehler+=result[i][j]!=result2[i][j]; } } std::cout<<"fehler:"<<fehler<<"\n"; return 0; }
dann nochmal ein anderer Wert, bei dem man nicht 3 jahre auf Jesters Algo warten muss:
Seed:6432567
Ebene: 100x100
Anzahl: 1500000mein Algo: 1406
Jester: 72500//edit bissl schnellerer default algo drin
//edit1 fehler entfernt
//edit2 so, ausgabe nun auch in ms
-
Darf man aus der "algorithm"-Funktion heraus auch noch andere selbstgeschriebene Funktionen aufrufen? Falls man evtl Rekursivität braucht? Und darf man (kleine) selbstgeschriebene Klassen einbringen?
-
BlaBlubb schrieb:
Darf man aus der "algorithm"-Funktion heraus auch noch andere selbstgeschriebene Funktionen aufrufen? Falls man evtl Rekursivität braucht? Und darf man (kleine) selbstgeschriebene Klassen einbringen?
Klar. Du gibst mir einfach eine .C++ Datei ab, und da können eigene Funktionen oder Klassen drin stecken. Die Endung des Dateinamens ist nich verbindlich.
-
otze:
Ja, das Problem hatte ich auch, danke für Deinen Code. Damit läuft's bei mir auch. Wir können auch gerne den Code den Du gepostet hast als Referenz nehmen. Die Wartezeiten sind ja schon enorm sonst...
Wie wär's wenn wir den Code noch auf rapsos twister umstellen. Der seed ist zwar schön und gut, aber woher weiß ich, dass unser rand damit das gleiche produziert?
-
ja, können wir machen. ich editiere gleich den neuen code rein
//edit ist drin. hoffe ich hab keinen Fehler gemacht
-
Der algo heißt jetzt algorithmTest, Du rufst aber noch algorithmJester auf.
-
Und wenn Du grad dabei bist... Ausgabe in ms wäre nice. So sieht man fast nix.
-
ist drin.
-
Ich forder jetzt einfach so lange Änderungen an, bis Du aus versehen mal Deinen algo mitpostest.
-
Ich werde spätestens morgen meine Rechteckgeneratoren hier posten. Zur Zeit sind das ungefähr:
- Dot-Generator: Jedes Rechteck ist ein Punkt
- Wiring-Generator: Es wird ein VLSI-Routing mit sehr vielen Layern simuliert.
- Placement-Generator: Es wird ein VLSI-Placmenet simuliert. Das heisst, dass es sehr viele kleine
Rechtecke gibt und die Anzahl der Großen logarithmisch oder so abfällt.
Anregungen, Wünsche dazu?
-
Time needed 0s
Jestertime 444575ms
speedup 444575.000000
Correct: yesich hoffe einfach ich hab irgendwo nen bug, weil ich eigentlich nur stupide optimierungen machte, aber trotzdem lustig
welche cpu(s) hat der testrechner?
-
Jester schrieb:
Ich forder jetzt einfach so lange Änderungen an, bis Du aus versehen mal Deinen algo mitpostest.
kannste vergessen :D. der algo ist in ner anderen datei :p
@Ponto ist der dot generator ein generator der rechtecke der Form {minx,minx+1,miny,miny+1} erzeugt? oder {minx,minx,miny,miny}?
@rapso welche werte? 0-1 ticks hört sich schon ziemlich wenig an
-
otze schrieb:
@Ponto ist der dot generator ein generator der rechtecke der Form {minx,minx+1,miny,miny+1} erzeugt? oder {minx,minx,miny,miny}?
Ersteres.
-
rapso schrieb:
Time needed 0s
Jestertime 444575ms
speedup 444575.000000
Correct: yesich hoffe einfach ich hab irgendwo nen bug, weil ich eigentlich nur stupide optimierungen machte, aber trotzdem lustig
welche cpu(s) hat der testrechner?
Das sieht nach einer trivialen Optimierung aus, die sich einen grundlegenden Defekt der bisherigen Generatoren zu nutze macht... - ich hab das gleiche Problem
-
rapso schrieb:
welche cpu(s) hat der testrechner?
8 AMD Opeterons 2.6GHz
-
camper schrieb:
Das sieht nach einer trivialen Optimierung aus, die sich einen grundlegenden Defekt der bisherigen Generatoren zu nutze macht... - ich hab das gleiche Problem
gibt es zum defekt nähere auskunft? ich kenn mich mit der theorie net so aus, vorallem was generatoren etc angeht, und was hat das für auswirkungen? Muss ja nix genaues sein, schon garnet, welche optimierung das ist. Und was ist daran ein Problem?
-
otze schrieb:
camper schrieb:
Das sieht nach einer trivialen Optimierung aus, die sich einen grundlegenden Defekt der bisherigen Generatoren zu nutze macht... - ich hab das gleiche Problem
gibt es zum defekt nähere auskunft? ich kenn mich mit der theorie net so aus, vorallem was generatoren etc angeht, und was hat das für auswirkungen? Muss ja nix genaues sein, schon garnet, welche optimierung das ist. Und was ist daran ein Problem?
Vielleicht meint er, dass man sich recht sicher sein, kann, dass die Lösung der Generatoren hohe Zahlen haben wird.