Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: Suchschleife auf 2 Threads / CPUs aufteilen (OpenMP?)

  Alt 10. Apr 2007, 18:14
Zitat von Der_Ventilator:
Meine Idee: Das irgendwie zu parallelisieren:

Also die ersten 5.000 Einträge werden von der einen CPU, die anderen von der anderen CPU durchsucht,
dadurch müsste sich doch die Suchzeit fast halbieren.
Hi,
beim parallelisieren solltest Du immer vorsichtig sein. Fehler die Du hier machst, wirst Du nicht so leicht/schnell finden, wie andere. Sie können sich ganz unterschiedlich zeigen oder auch nur auf einem Rechner auftreten.
Zudem solltest Du die Verwaltung von Threads nicht unterschätzen, so wirklich doppelt so schnell ist selten drin. Vorallem solltest Du auch nicht davon ausgehen, dass nur weil Du 2 CPUs und zwei Threads hast jetzt je ein Thread pro CPU abgearbeitet wird. Welche CPU was rechnen soll/darf entscheidet Windows. So kann es sein, dass auf der einen CPU Deine Threads laufen und auf der anderen einer der Windows-Dienste. Dann verlierst Du definitiv Zeit, da die Verwaltung der Threads von der Rechenzeit abgeht, die Dir zur Verfügung steht.


Zitat von Der_Ventilator:
Der klassische Weg:

Delphi-Quellcode:
 for i:=0 to 10.000 do
Daten[i].Anzeigen := ( Daten[i].Inhalt = Suchbegriff ) ;

Dieser Vorgang dauert in meinem Programm ca. 400ms, also spürt der Nutzer eine kleine Verzögerung.
Wonach suchst Du denn? Ich meine gibt es immer eine Sache nach der Du suchst? Kommen bestimmte Dinge häufiger in der Suche vor als andere? An sich kannst Du Dir hier einfach die Idee von Primären und Sekundären Indizes anschauen. Soetwas wird typischer Weise in Datenbanken gemacht, hier werden Daten nicht einfach in linearen Strukturen abgelegt, sondern in solchen, die einen schnelleren Zugriff erlauben, wenn man nach bestimmten Kriterien sucht.
Speicherst Du hier z.B. Verweise auf jedes Datum sortiert nach dem Inhalt ab, so müsstest Du nur etwas mehr Speicher einplanen. Bei 10.000 Datensätzen wären das stolze 40 KByte (sogar etwas weniger). Dafür kannst Du dann aber auch mit binärer Suche die Anzahl der zu betrachtenden Daten deutlich einschränken, was auch einiges an Zeitersparnis bringen dürfte.
Das ganze ist natürlich nicht für jedes Suchkriterium sinnvoll, i.d.R. erstellt man solche Indizes (die häufig auch etwas geschickter aufgebaut sind) nur für die Teile der Daten, nach denen auch häufig gesucht wird.

Zitat von Der_Ventilator:
Vor allem, wenn während des Eingebens des Suchbegriffes bereits gesucht wird, muss der Nutzer nach jedem Buchstaben 400ms warten.
Hier solltest Du die Suche dann auf jeden Fall an einen Thread übergeben und den einfach abbrechen, sobald ein neuer Buchstabe hinzugekommen ist. Eventuelle solltest Du zusätzlich noch über eine kleine Verzögerung nachdenken, damit ein Benutzer mehr als einen Buchstaben tippen kann, bevor die Suche startet.

Zitat von Der_Ventilator:
Oder ist etwa die CPU gar nicht der limitierende Faktor?
Schwer zu sagen, kommt nicht zuletzt darauf an, wo Deine Daten liegen. Wird für jede Iteration das Datum an der Stelle i erst aus einer Datei gelesen, wird sicherlich nicht die CPU der limitierende Faktor sein. Kommt natürlich auch auf die Daten an, sind 10.000 davon zu groß um im Hauptspeicher zu landen, so wird ein Teil davon ausgelagert und das kostet wieder viel Zeit. Da empfielt es sich dann, die Daten in kleineren Portionen zu verarbeiten.

Zitat von Der_Ventilator:
Jedenfalls habe ich gelesen, dass es mit C++ die Möglichkeit gibt mittels OpenMP in den Code einfach ein paar Anweisungen der Art: "Parallelisiere den nächsten Abschnitt" einfügen kann, ohne dass man an seinem eigentlichen Code etwas ändern muss.
Wikipediaartikel zu OpenMP

Gibt es sowas auch mit Delphi?
Also für Delphi habe ich das noch nicht gesehen.

Gruß Der Unwissende
  Mit Zitat antworten Zitat