Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Threading

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 16.06.2009, 15:27    Titel: Threading Antworten mit Zitat

Gibt es irgendwo eine tiefergehendere Hilfestellung zum Thema Multithreading in FB?

Das kleine Tutorial von http://www.freebasic-portal.de/index.php?s=tutorials&id=54&seite=1
ist irgendwie nicht sehr hilfreich, wenn man wirkliche Geschwindigkeitsvorteile aus mehreren Threads rausholen möchte.

Insbesondere das Vorgehen in Threads, die auf gemeinsame Resourcen zugreifen sollen, kommt in dem Tutorial ziemlich kurz.

Vor allem frage ich mich ob es überhaupt Sinnvoll ist einen Thread zu schreiben der im Kern so aussieht:
Code:

For X = 1 to 100
    MutexLock(MyMutex)
        .
        .
        .
    MutexUnLock(MyMutex)
    Sleep 100, 1
Next

(Gibts bei sowas tatsächlich überhaupt Geschwindkeitsvorteile??)

Oder man stelle sich vor, mehrere Threads sollen auf ein großes globales Array zugreifen.
Bisher habe ich für jeden Thread Kopien von den Variablen angefertigt, die der Thread für seine Berechnungen braucht. Dadurch, das jeder Thread mit seinen eigenen Variablen arbeiten kann, gabs nie probleme zwischen den Threads, aber dafür übelste Speicherverschwendung!

Solche Dinge würde ich auch gerne mal detailierter in einem Tutorial nachlesen können...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The_Muh
aka Mark Aroni


Anmeldungsdatum: 11.09.2006
Beiträge: 718

BeitragVerfasst am: 16.06.2009, 17:14    Titel: Antworten mit Zitat

Ich bin zwar zum Thema Geschwindigkeit + Threading nich der Spezialist, aber ich glaube wenn man wirklich mehr geschwindigkeit haben will, sollte man auf Hyperthreading oder GPU-Threading zurückgreifen. Auf einem Singlecore sollte ein zusätzlicher Thread kaum merkliche vorteile bringen.

Ich nutze Threads nur zu Paralellverarbeitung in meinem IRC-Bot.
Und... wenn du nicht mit Mutexen arbeiten willst, und eine Variable zur verarbeitung sowieso nur liest, kannst du unter umständen drauf verzichten. Ich hab in nem kleineren Test dazu keine Fehler bekommen, aber garantieren kann ich dir das nicht.

mfg
Muh
_________________
// nicht mehr aktiv //
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 16.06.2009, 17:36    Titel: Antworten mit Zitat

@ The_Muh: Ich habn Vierkern rechner zwinkern da bringen mehrere Threads wesentlich mehr Leistung! .. Durchaus, können aber auch mehr Threads als CPU-Kerne mehr leistung bringen. (Auch wenn es sich erstmal unlogisch anhört)
Letzteres ist bestimmt Betriebssystemabhängig... schätze ich mal.

Das parallele lesen aus einem array war durchaus auch schon problematisch. Hab damit schon abstürze des programms bekommen..

Irgendwie scheint der Speicher, der nicht von dem Thread selbst alloziiert wurde ohne Mutex gar nicht vernünftig zugänglich.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 16.06.2009, 19:09    Titel: Antworten mit Zitat

Mehere threads werden auch schon lange auf single-cores genutzt (denkt nur mal an euer betriebssystem, auch in spielen wird das z.B. oft benutzt). dabei kann man ein programm wesentlich flexibler gestalten.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 16.06.2009, 20:16    Titel: Antworten mit Zitat

@OneCypher
$ Threads arbeiten nicht zwangsläufig auf 4 Kernen seperat. Die verwaltugn von Thread<->CPU assoziation wird vom OS übernommen. Es gibt zwar unter windows (linux ka) API methoden, um Threads einer CPU bzw. einem Kern zu zuordnen, jedoch wird selbst in der MSDN darauf hingewiesen diese APIs nicht zu verwenden, wenn man nicht wirklich absolut sicher ist zu wissen, was man da tut.

Zu deinem MutexProblem.

Mutexe sind dafür gedacht Zugriffe (Lesen UND Schreiben) auf ein und die selbe Resource zu schützen. Hast du mehrere Threads und greifst auf die Resource zu, dann geht es nicht anders als diese per Mutex zu schützen.
Das ist z.B. eines der gravierendsten Probleme bei der Prozessorentwicklung.
Zur zeit werden nicht mehr auf geschwindigkeit getrimmte CPUs geforscht (mehr ca. 4GHz), weil sich zu viele Probleme dabei bilden, die nicht mehr kompensiert werden können.

Daher wird auf Multicore gesetzt. Das Problem ist jedoch, das Programme die für solche Multicore (planungen gehen zur zeit bis mehr als 128Cores pro CPU) keinen grafierenden leistungsvorteil mehr erhalten.

Wie du schon gemerkt hast, kann ein Mutex solch eine effektivität sehr einschränken. Auch das haben die Entwickler von CPUs und OS's erkannt. Das lässt sich jedoch nicht anders realisieren, da jeder Kern auf den selben Speicher zugreift. Um hier eine effektivität zu erhalten sind CPUs mit seperaten RAM speicher bzw. RAM speicherbeeich nötig, die über einen eigenen RAM manager, zwischen den eigentlichen zugriffe auf einen speicherbereich die daten synchronisieren. Dadurch kann die lesearbeit ohne mutex erfolgen, jedoch nciht der schreibvorgang. Ich selbst arbeite z.B. zur zeit an solch eien mechanissmuss in meinem OS, was erfolgsversprechend ist.

Nachteil ist hier jedoch, das schreibzugriffe deutlich langsamer von statten gehen, auf eine gemutexte variable im mixed memory.

Aber, um auf dein eigentliches Problem zurück zu kommen:
Hier ist in der tat ein effektiver mutex design nötig.
Am besten erarbeitest du ersteinmal ein Konzept, auf zugriffe auf das array.
* Ist es wirklich nötig an allen stellen auf das array zuzugreifen?
* Ist das Array ein UDT, dann kann es von vorteil sein, bei komplexen zugriffen darauf das gesammte Arrayelement zwischenkopiert werden, um mehrfache lesezugriffe zu beschleunigen.
Code:

type bla
   foo as integer
   bar as integer
  '...
end type
dim shared arrayd() as bla

for x as uinteger = 1 to 100
Dim tvar as bla
mutexlock(..)
tvar = arrayd(x)
mutexunlock(...)

if tvar.foo = 1 then
  if tvar.bar = 1 then
    mutexlock(...)
       tbar.bar = 2
    mutexunlock(...)
  end if
end if
next

Wie gesagt, sind viele variablen gegeben, udn wird hauptsächlich gelesen, kann das zwischenkopieren einen geschwindigkeitsvorteil erzugen. dazu wäre es gut zu wissen, in welchem verhältniss der kopiervorgang mit dem eigentlichen zugriff mit mutexen steht.
Beim schreiben kann das mutex immernoch gelockt werden.

* zu deinem Beispiel. Wenn die Forschleife explizit auf 100 const fixiert ist, kann man es so machen. Nutzt du jedoch ein UBound oder eine zwischenvariable mit der anzahl Einträge auf das array, ist sicherzustellen, das entweder schon vor der For schleife ein lock erfolgt, und dann erst nach der Next wieder entlockt wird (array-bound könnte sich ändern, nach dem unlock), oder aber verhindert wird, das das array sich verkleinern kann.

Hinzu kommt, das der Speicherbereich des arrays, vorallem der Pointer auf diese, sich ändern kann. Das liegt am Paging mechanissmuss, und lässt sich nicht abändern.


PS: das tut ist eher an Mutexe gelehnt, nicht an Threading.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 17.06.2009, 02:15    Titel: Antworten mit Zitat

[EDIT] Tut ist jetzt online: http://www.freebasic-portal.de/index.php?s=tutorials&id=56&seite=1


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]


Zuletzt bearbeitet von ThePuppetMaster am 17.06.2009, 17:23, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 17.06.2009, 10:07    Titel: Antworten mit Zitat

DAS IST DOCH MAL WAS GENAUES!! DANKE!!

Werd mich da aber erstmal im Detail durcharbeiten müssen..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 19.06.2009, 00:35    Titel: Antworten mit Zitat

Hab heute noch eines geschrieben, das sich mit der Optimierung von Threads befasst. Sollte in den nächsten Tagen unter "Threading Optimierung" auftauchen.

MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 19.06.2009, 11:15    Titel: Antworten mit Zitat

Hi,
ich versuche mich gerade als Korrektor und Lektor an deinen Tuts.
Es wird etwas dauern verwundert .
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz