"schneller" code?
-
Hallo allerseits!
Ich habe das Problem, dass ich aus mehreren Threads meines Programms Daten in eine shared memory hin und her kopieren muss. Organisiert habe ich Daten als Arrays. Gibt es irgendwelche Kniffe mit denen man das Kopieren im Speicher schneller (auf kosten der Sicherheit) machen kann? Z.B. habe ich irgendwo gelesen, dass man statt:
for(long i = 0; i < size; i++) { arrayA[i] = arrayB[i]; }besser so was schreiben kann:
double *pToArrayA = arrayA; double *pToArrayB = arrayB; for(long i = 0; i < size; i++) { *pToArrayB = *pToArrayB; pToArrayA++; pToArrayB++; }da die Zeigearithmetik schneller auf der CPU ausgeführt werden kann, als die Indizierung. Wie sieht es mit memcpy aus? Das wäre doch in diesem Fall angebrachter oder? Kann mir jemand viellecht einen guten Tipp geben, wo man eine Vorlesung, ein Buch, Podcast, Bolg, was auch immer, zu dem Thema finden kann, dass nicht totaler Blödsinn ist? Ich könnte mir vorstellen, dass diejenigen unter euch, die Informatik studiert haben, mir einfach sagen können: "Geh in die Bib und nimm das Buch von <insertSmartAutor> und gut is."

-
Da hätte ich in der Tat etwas Lesematerial:
http://www.linux-kongress.org/2009/slides/compiler_survey_felix_von_leitner.pdfIch denke, die Frage dürfte sich danach weitgehend erübrigt haben.
Edit: ein ähnlicher Thread:
http://www.cplusplus.com/forum/general/28019/
-
Wie sieht es mit memcpy aus?
Warum speicherst Du deine Daten ueberhaupt am Stueck, also in nem Array, und in PODs, wenn "den" Vorteil davon schlechthin ned nutzen wölltest.
memcpy drängt sich förmlich auf ...Ciao ...
-
Athar schrieb:
Da hätte ich in der Tat etwas Lesematerial:
http://www.linux-kongress.org/2009/slides/compiler_survey_felix_von_leitner.pdfIch denke, die Frage dürfte sich danach weitgehend erübrigt haben.
Edit: ein ähnlicher Thread:
http://www.cplusplus.com/forum/general/28019/Dankeschön. Das werde ich mir mal durchlesen.
Ich habe noch eine Frage in der Richtung. Gibt es eine Möglichkeit schnell aus einem Array von z.b. int ein Array von double zu machen? So wie in meinem Beispiel oben mit static_cast ist das auf Dauer nicht fix genug.
Das Problem ist folgendes: Ich will mein Array aus int mittels Qwt-Plot auf dem Schirm darstellen. Leiter hat die Klasse QwtPlot nur eine Schnittstelle für Double und keine für ints. Mein Array von Anfang an als Double zu casten ist keine Option.
-
waschbaerFurcht schrieb:
int ein Array von double zu machen?
Da
intunddoublemeistens eine unterschiedliche Grösse haben, kann man entweder ein neues Array machen und dann konvertieren oder mitreinterpret_castdas Array "umwürgen". Beim letzteren kommt wahrscheinlich nicht das Ergebnis raus, welches du dir gewünscht hast.
-
Und was ist mit der impliziten Typumwandlung?
-
EOutOfResources schrieb:
waschbaerFurcht schrieb:
int ein Array von double zu machen?
Da
intunddoublemeistens eine unterschiedliche Grösse haben, kann man entweder ein neues Array machen und dann konvertieren oder mitreinterpret_castdas Array "umwürgen". Beim letzteren kommt wahrscheinlich nicht das Ergebnis raus, welches du dir gewünscht hast.Ja gut, soweit war ich auch schon. Einen effizienten Weg gibts da nicht? Wie sieht so ein
reinterpret_castdenn in Assembler aus?
-
waschbaerFurcht schrieb:
EOutOfResources schrieb:
waschbaerFurcht schrieb:
int ein Array von double zu machen?
Da
intunddoublemeistens eine unterschiedliche Grösse haben, kann man entweder ein neues Array machen und dann konvertieren oder mitreinterpret_castdas Array "umwürgen". Beim letzteren kommt wahrscheinlich nicht das Ergebnis raus, welches du dir gewünscht hast.Ja gut, soweit war ich auch schon. Einen effizienten Weg gibts da nicht? Wie sieht so ein
reinterpret_castdenn in Assembler aus?Der Compiler macht dir da keine Umwandlung sondern interpretiert das Bit Muster einfach anders. Assembler kennt keine Typen.
Warum kannst du nicht von Anfang an doubles nehmen?
-
waschbaerFurcht schrieb:
Das Problem ist folgendes: Ich will mein Array aus int mittels Qwt-Plot auf dem Schirm darstellen. Leiter hat die Klasse QwtPlot nur eine Schnittstelle für Double und keine für ints. Mein Array von Anfang an als Double zu casten ist keine Option.
Qwt-Plot ist dein Problem, nicht der static_cast. Das Ding zieht dir die Handbremse und du denkst darüber nach, wie du die Bremse etwas lockerer stellen kannst.

-
otze schrieb:
waschbaerFurcht schrieb:
Das Problem ist folgendes: Ich will mein Array aus int mittels Qwt-Plot auf dem Schirm darstellen. Leiter hat die Klasse QwtPlot nur eine Schnittstelle für Double und keine für ints. Mein Array von Anfang an als Double zu casten ist keine Option.
Qwt-Plot ist dein Problem, nicht der static_cast. Das Ding zieht dir die Handbremse und du denkst darüber nach, wie du die Bremse etwas lockerer stellen kannst.

Guter Punkt. Vielleicht kann ich irgendwie festellen, welche Daten überhaupt auf dem Schirm gezeigt werden können. Den Rest muss ich dann eigentlich nicht mit transformieren. Mal sehen ob sich da was machen lässt.
Warum ich nicht gleich Doubles nehme: Genau genommen handelt es sich bei den Daten nicht ums Ints sondern Shorts. Die Daten stammen aus einem 10bit AD-Wandler. Daher brauche ich auch die Nachkommastellen nicht.
-
Wenn du keine Negativen shorts hast, bzw. diese mittels +32768 in einen reinen Positivbereich verschieben würdest, könntest du das double array "nullen" und in den unteren Teil der Doubletypen einfach deine Werte schreiben.
D.h. keine komplexen Konversationen um Exponenten und Vorzeichen-bit zu setzen.for (int i=0;i<size;i++) { //1023 ist der Bias Wert von double, um die Komma stelle nicht zu verschieben (long long)arrayA[i] = (1023 << 52) | arrayB[i]; }Ungetested! Und ich kann auch nichts zur Performance versprechen. Teste es einfach mal aus.