 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 16.06.2009, 15:27 Titel: Threading |
|
|
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 |
|
 |
The_Muh aka Mark Aroni

Anmeldungsdatum: 11.09.2006 Beiträge: 718
|
Verfasst am: 16.06.2009, 17:14 Titel: |
|
|
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 |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 16.06.2009, 17:36 Titel: |
|
|
@ The_Muh: Ich habn Vierkern rechner 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 |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 16.06.2009, 19:09 Titel: |
|
|
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 |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 16.06.2009, 20:16 Titel: |
|
|
@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 |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 17.06.2009, 10:07 Titel: |
|
|
DAS IST DOCH MAL WAS GENAUES!! DANKE!!
Werd mich da aber erstmal im Detail durcharbeiten müssen.. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 19.06.2009, 00:35 Titel: |
|
|
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 |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 19.06.2009, 11:15 Titel: |
|
|
Hi,
ich versuche mich gerade als Korrektor und Lektor an deinen Tuts.
Es wird etwas dauern . _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
|
|
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.
|
|