Abgabe Effiziente Programme WS16/17

Abgabe Effiziente Programme WS16/17

Sie können ein beliebiges Beispiel wählen.

Wer nichts anderes vorhat, kann die unten vorgegebene Aufgabe für dieses Semester wählen.

Natürlich können Sie, wenn Sie wollen, auch die Implementierung eines anderen Problems optimieren; allerdings hat das einige Nachteile: Sie müssen einen Teil der Zeit Ihrer Präsentation für die Erklärung des Problems und des Algorithmus aufwenden, und die Ergebnisse sind nicht direkt vergleichbar. Der Vorteil (vor allem, wenn Sie einen späteren Termin wählen) ist, dass Sie nicht das wiederholen, was andere gemacht haben, oder ein langsameres Programm präsentieren.

Bereiten Sie eine 18-minütige Präsentation vor (am besten machen Sie einen Probelauf, damit sich die Präsentation auch sicher in der Zeit ausgeht). Da Sie dabei nicht soviel Zeit haben wie ich in der Vorlesung, präsentieren Sie die meisten Schritte nur im Überblick (also eventuell nur, wieviel er gebracht hat), und nur ein paar besonders interessante Schritte mit mehr Details. Besonders interessant sind u.a. die Schritte, die unerwartet viel oder unerwartet wenig bringen.

Erlaubte Optimierungen

Auch wenn der Fokus bei der Vorlesung nicht bei effizienten Algorithmen lag, dürfen Sie auch Algorithmen und Datenstrukturen ändern (damit erübrigt sich die Frage, ob eine Änderung den Algorithmus ändert oder nicht).

An sich muss das optimierte Programm für die gleiche Eingabe die gleiche Ausgabe produzieren wie das Originalprogramm, insbesondere für die gemessenen Testfälle. Sie können Sich auch überlegen, bestimmte Eingaben nicht korrekt zu verarbeiten, müssen das dann aber dokumentieren und begründen, warum Sie meinen, dass das sinnvoll ist.

Sie dürfen auch die Programmiersprache ändern.

Ausgeschlossen sind allerdings Optimierungen zu Trivialprogrammen (z.B. if Eingabe=Benchmarkeingabe then print Benchmarkausgabe), da dabei zuwenig zu lernen ist.

Bei der vorgegebenen Aufgabe dieses Jahr darf nur vectors.c und vectors.h geändert werden, der Rest (also main.c) ist als Eingabe für den Benchmark zu betrachten.

Vorgegebene Aufgabe: Vektor-Library

Alles zusammengepackt finden Sie in effizienz-aufgabe17.tar.gz.

Das Interface der Vektor-Library ist in vectors.h umrissen. Ein wichtiger Aspekt dabei ist, dass die Vektoren Werte-Semantik haben und unveränderbar sind. Sie verlässt sich dafür darauf, dass die Anwendung die Vector-Werte nur mit den vorgesehenen Operationen verarbeitet, und sie z.B. nicht mit einfachen Zuweisungen kopiert, oder einen Vektor in einer Variable mit einer einfachen Zuweisung ueberschreibt. Sie können sich bei der Optimierung auch darauf verlassen.

In der Referenzimplementierung vectors.c wird die Wertesemantik so implementiert, dass es immer nur eine Referenz auf einen Vektor gibt, und beim Erstellen einer neuen Referenz mit vcopy() auch gleich der zugehörige Vektor kopiert wird; stattdessen kann man die Referenz auch weitergeben, sodass am ursprünglichen Platz keine Referenz mehr übrigbleibt (vconsume()). Durch diese Eigenschaft der Implementierung kann z.B. vsum(), das zwei Vektoren verbraucht und einen erzeugt, den Speicher eines Operanden für sein Resultat verwenden, und verletzt dabei die Bedingung der Unveränderbarkeit nicht: der Operand wurde ja durch vsum verbraucht und sein Speicher würde sonst einfach freigegeben werden (und Speicher für das Resultat allokiert werden).

Die Anwendung ist eine Variante der Matrixmultiplikation aus der Vorlesung, wobei wir hier für die Messung eine 1999x1999-Matrix mit einer 1999x99-Matrix multiplizieren (Ihr Programm soll aber auch für andere Größen funktionieren). Verändern Sie main.c nicht, sondern optimieren Sie nur vectors.c! Auch wenn auch hier eine Matrixmultiplikation vorkommt, sind die Optimierungsgelegenheiten hier zum Großteil ganz andere als bei dem Beispiel in der Vorlesung.

Mit make check können Sie testen, ob das Programm noch das richtige Resultat für den Testfall liefert. Mit make perf können Sie den Code benchmarken. Das Resultat für die Originalversion ist:

     1801950627  cycles                   #      0.000 M/sec
     4451503743  instructions             #      2.470 IPC  

    0.684736980  seconds time elapsed
Das sind die Basiswerte, mit denen Sie Ihre Lösung vergleichen sollten (am Besten, indem Sie einen Speedup-Faktor angeben). Relevant sind vor allem die Zyklen, andere Werte können aber zur Erklärung der gemessenen Zyklen dienen.

Sie können Ihr Programm (und Doku dazu, z.B. Ihre Präsentation) im Web veröffentlichen (wird nicht beurteilt), und zwar indem Sie auf /nfs/unsafe/httpd/ftp/pub/anton/lvas/effizienz-abgaben/2016w ein Verzeichnis anlegen und Ihre Dateien in diesem Verzeichnis ablegen.

Aufgaben vom [WS02/03 | WS03/04 | WS04/05 | WS05/06 | WS06/07 | WS07/08 | WS08/09 | WS09/10 | WS10/11 | WS11/12 | WS12/13 | WS13/14 | WS14/15 | WS15/16 | WS16/17 ]

Termin/Anmeldung zur Präsentation

Die Termine sind:
11.1., 18.1., 25.1.
Die Terminvergabe erfolgt über TISS. Bitte bestimmen Sie genau eine(n) Ihrer Gruppe, der den Termin anmeldet, und die/der macht das dann.
Anton Ertl
[ICO]NameLast modifiedSizeDescription

[DIR]Parent Directory  -  
[   ]Makefile04-Dec-2017 17:42 519  
[CMP]effizienz-aufgabe17.tar.gz04-Dec-2017 17:45 1.1M 
[TXT]main.c04-Dec-2017 13:38 1.7K 
[   ]main.o04-Dec-2017 16:40 4.4K 
[   ]matmul.1999x1999x9904-Dec-2017 13:37 1.5M 
[   ]matmul.out04-Dec-2017 16:40 1.5M 
[   ]mm04-Dec-2017 16:40 12K 
[   ]perf.data04-Dec-2017 13:37 449K 
[TXT]vectors.c01-Dec-2017 19:23 2.0K 
[TXT]vectors.h26-Nov-2017 00:08 1.7K 
[   ]vectors.o04-Dec-2017 16:40 4.6K 

Apache/2.2.22 (Debian) DAV/2 mod_fcgid/2.3.6 PHP/5.4.36-0+deb7u3 mod_python/3.3.1 Python/2.7.3 mod_ssl/2.2.22 OpenSSL/1.0.1e mod_perl/2.0.7 Perl/v5.14.2 Server at www.complang.tuwien.ac.at Port 80