Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++ (auch C++0x und C++11) ::  [gelöst Danke]Parallelisierung einer For-Schleife  
Gehen Sie zu Seite Zurück  1, 2, 3, 4, 5, 6, 7, 8  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
ComputerCarl
Mitglied

Benutzerprofil
Anmeldungsdatum: 23.09.2009
Beiträge: 68
Beitrag ComputerCarl Mitglied 17:11:00 26.05.2012   Titel:              Zitieren

Haha, nein bin ich wirklich nicht, sorry. :rolleyes:

Aber dennoch ändert sich nichts an dem was ich gesagt habe.
Ich mein eine leicht veränderte Semantik heißt für mich nicht
gleich, dass Dinge falsch werden. (Das Wort "leicht" hat für
mich irgendwie was anderes impliziert. Egal...)
Und gprof: Ja ok. Bringt mir auch nicht mehr Infos über den
zeitlichen Ablauf als clock(). Die Zeit bleibt in den
for-schleifen. Und nein, ich kopiere nichts etc. Ich berechne
nur die Forward- und Backward-MAtrix wie schon beschrieben und
so wie sie definiert sind.

Weiter habe ich die Dimensionsanzahl auf 1 reduziert. Musste aber
dennoch einen Vector nehmen, da bei einem Array die exe einfach
abbricht. Hat das was mit diesem Stack-Overflow zu tun?

Ok. Sollte also nichts mehr zu der Parallelisierung gesagt werden,
danke auf jedenfall nochmal für die Compiler-tipps und etc.
cooky451
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.10.2010
Beiträge: 6869
Beitrag cooky451 Mitglied 17:12:25 26.05.2012   Titel:              Zitieren

Wenn du einfach mal den Code posten würdest, könnte man den dir auch schneller machen. ;)

_________________
Sie sind nicht berechtigt unrechtmäßige Kopien dieses Datenträgers zu erstellen.™
Keksverteilungsbeauftragter
ComputerCarl
Mitglied

Benutzerprofil
Anmeldungsdatum: 23.09.2009
Beiträge: 68
Beitrag ComputerCarl Mitglied 17:41:03 26.05.2012   Titel:              Zitieren

Oh, das klingt echt super.
Um es ein bisschen übersichtlicher zu machen, habe ich alle Logarithmen
und Scalierungen entfernt. Sollte irgendwo dennoch ein exp() oder log()
stehen, nicht wundern.


Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
vector<double> forward_matrix (data.size() * max_length * states.size(),0);
vector<double> backward_matrix(data.size() * max_length * states.size(),0);
vector<double> seq_prob (data.size(), 0);
 
for(int n = 0; n < data.size(); n++) {
    // Berechnung aller Forward-Matrizen
    for(int i = 0; i < states.size(); i++)
    { forward_matrix[n * states.size() * max_length + i] = start[i] * emission[i][my_hash(data[n][0], alphabet)]; }
 
           
    for(int i = 1; i < data[n].size(); i++) {
        for(int j = 0; j < states.size(); j++) {
 
            double tmp_prob = 0;
            for(int k = 0; k < states.size(); k++)
                        { tmp_prob +=  forward_matrix[n * states.size() * max_length + (i-1) * states.size() + k] * transition[k][j]; }
 
            forward_matrix[n * states.size() * max_length + i * states.size() + j] = tmp_prob * emission[j][my_hash(data[n][i], alphabet)];
        }
    }
 
    // Berechnung aller Backward-Matrizen
        for(int i = 0; i < states.size(); i++)
    { backward_matrix[n * states.size() * max_length + (data[n].size()-1) * states.size() + i] = 1; }
 
 
     for(int i = data[n].size()-2; i >= 0; i--) {
        for(int j = 0; j < states.size(); j++) {
 
                    double tmp_prob = 0;
            for(int k = 0; k < states.size(); k++)
            { tmp_prob += backward_matrix[n * states.size() * max_length + (i+1) * states.size() + k] * transition[j][k] * emission[k][my_hash(data[n][i+1],alphabet)]; }
 
            backward_matrix[n * states.size() * max_length + i * states.size() + j] = tmp_prob;
        }
    }
     
    // Berechnung der Sequenz-Wahrscheinlichkeiten
    seq_prob[n] = 0;
    for(int i = 0; i < states.size(); i++)
        {seq_prob[n] += backward_matrix[n * states.size() * max_length + 1 * states.size() + i] * forward_matrix[n * states.size() * max_length + 1 * states.size() + i]);}
}
Michael E.
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.10.2003
Beiträge: 5712
Beitrag Michael E. Mitglied 23:08:10 26.05.2012   Titel:              Zitieren

Du hast immer noch mehrdimensionale Vektoren.

_________________
Your password must be at least 18770 characters and cannot repeat any of your previous 30689 passwords. Please type a different password. Type a password that meets these requirements in both text boxes. (http://support.microsoft.com/kb/276304/en-us/)
ComputerCarl
Mitglied

Benutzerprofil
Anmeldungsdatum: 23.09.2009
Beiträge: 68
Beitrag ComputerCarl Mitglied 11:19:58 27.05.2012   Titel:              Zitieren

Ich dachte, ich hätte die mehrdimensionalen Vectoren entweder
1-dimensional gemacht oder mit Arrays ersetzt. Und ich glaub,
ich bin schon ganz blind für den Code geworden, aber ich sehe
keine mehrdimensionale Vectoren mehr.
emission und transition sind eigentlich Arrays. Aber das hätte
ich wohl deutlich machen sollen. Kommt es bei Arrays auch zu
Problemen, wenn sie mehrdimensional werden?
cooky451
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.10.2010
Beiträge: 6869
Beitrag cooky451 Mitglied 11:21:09 27.05.2012   Titel:              Zitieren

ComputerCarl schrieb:
Kommt es bei Arrays auch zu
Problemen, wenn sie mehrdimensional werden?
Nein.
Was ich aber meinte war kompilierbaren Code (am besten in einer Datei), dann kann man nämlich einfach nen Profiler drüber laufen lassen und muss die Arbeit nicht selbst machen. ;) (Und bitte einheitlich einrücken..)

_________________
Sie sind nicht berechtigt unrechtmäßige Kopien dieses Datenträgers zu erstellen.™
Keksverteilungsbeauftragter


Zuletzt bearbeitet von cooky451 am 11:21:45 27.05.2012, insgesamt 1-mal bearbeitet
ComputerCarl
Mitglied

Benutzerprofil
Anmeldungsdatum: 23.09.2009
Beiträge: 68
Beitrag ComputerCarl Mitglied 11:31:54 27.05.2012   Titel:              Zitieren

Hier steh ich kurz noch auf dem Schlauch.
Also ich kann schnell noch kompilierbaren Code
draus machen, würde aber auch nur data.size und
so auf irgendwelche Konstanten setzen.
Ich dachte ein Profiler ist zur Zeitmessung da.
Der kann auch Dinge parallelisieren?
Ich wollte nur Fragen bevor ich sinnlos Code
umschreibe.
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 17915
Beitrag SeppJ Moderator 12:15:05 27.05.2012   Titel:              Zitieren

ComputerCarl schrieb:

Ich dachte ein Profiler ist zur Zeitmessung da.
Der kann auch Dinge parallelisieren?
Der allgemeine Verdacht der hier vorherrscht ist, dass dein Programm nicht langsam ist, weil es nicht-paralllel ist, sondern dass es langsam ist, weil es schlecht geschrieben ist. Mit vollständigem Code könnten wir dies beurteilen.

_________________
Du brauchst Hilfe?, Buchempfehlungen für C++,
Wie man in Fragen den richtigen Code postet,
The Definitive C++ Book Guide and List


Zuletzt bearbeitet von SeppJ am 12:15:36 27.05.2012, insgesamt 1-mal bearbeitet
ComputerCarl
Mitglied

Benutzerprofil
Anmeldungsdatum: 23.09.2009
Beiträge: 68
Beitrag ComputerCarl Mitglied 12:27:08 27.05.2012   Titel:              Zitieren

Ich dachte, ich hatte schon erwähnt, dass ich sowohl mit gprof
und anfänglich mit clock Messungen vorgenommen habe. Der Teil,
der in meinem Programm mehr als 77% der Zeit in Anspruch nimmt,
habe ich oben abgetippt.
Ich sehe deshalb keine Notwendigkeit das Problem noch komplexer
zu machen indem ich den ganzen Code hochlade. Ausserdem sehe ich
irgendwie nicht, dass meine eigentliche Frage mit der
Parallelisierung diskutiert wird. Das ist auch o.k. so, aber die
ganze Compiler, Vector-Geschichte ist eigentlich wirklich nicht
das was mich gerade so interessiert.
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 17915
Beitrag SeppJ Moderator 12:48:55 27.05.2012   Titel:              Zitieren

Wenn du selber so gut beurteilen kannst, was das richtige ist, dann brauchst du ja keine Ratschläge mehr. Sehr erstaunlicher ist auch, dass gprof dir den Code bis auf deine for-Schleife aufgelöst hat, denn das kann es eigentlich gar nicht. Man könnte sogar meinen, du hättest es gar nicht richtig benutzt. Wenn sich jedenfalls bei so exzessiver Benutzung von vector in Schleifen mit ansonsten trivialen Rechenschritten (bis auf das uns unbekannte my_hash) kein riesiger Unterschied zwischen unoptimiert und hochoptimiert ergibt, dann ist eigentlich für jeden klar, dass da etwas nicht stimmt. vector ohne Optimierungen ist saulangsam. Kleine Schleifen auch. Aber mit Optimierung wird normalerweise beides ungeheuer schnell. Siehe auch hier:

http://www.c-plusplus.de/forum/p2215569#2215569
http://www.c-plusplus.de/forum/p2215810#2215810

Wenn das bei dir so sehr anders ist, dann machst du höchstwahrscheinlich irgendeinen ganz dicken Hauer im Programm. Jeder weiß es, jeder sagt es, nur du möchtest es nicht hören.



P.S.:
Bitte
hör
auf
selbst
die
Zeilen-
um-
brüche
in deinem
Text
zu
setzen.
Nicht
jeder
hat
so
einen
kleinen
Bildschirm
.

_________________
Du brauchst Hilfe?, Buchempfehlungen für C++,
Wie man in Fragen den richtigen Code postet,
The Definitive C++ Book Guide and List


Zuletzt bearbeitet von SeppJ am 12:50:16 27.05.2012, insgesamt 1-mal bearbeitet
c++.de :: C++ (auch C++0x und C++11) ::  [gelöst Danke]Parallelisierung einer For-Schleife  
Gehen Sie zu Seite Zurück  1, 2, 3, 4, 5, 6, 7, 8  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.