Es geht mir darum verschiedene Schleifen, die millionenfach aufgerufen werden in einzelne Threads auszulagern und dann parallel ablaufen zu lassen. Dazu habe ich folgendes Testprogramm geschrieben
Code: Alles auswählen
OpenConsole()
Global Dim buffer(5)
Global mutex=CreateMutex()
Procedure liste(a,x)
LockMutex(mutex)
buffer(a)=x
UnlockMutex(mutex)
EndProcedure
Procedure s1(dummy)
For x=1 To 10
a=1
liste(a,x)
Next
EndProcedure
Procedure s2(dummy)
For x=1 To 10
a=2
liste(a,x)
Next
EndProcedure
Procedure s3(dummy)
For x=1 To 10
a=3
liste(a,x)
Next
EndProcedure
Procedure s4(dummy)
For x=1 To 10
a=4
liste(a,x)
Next
EndProcedure
Procedure s5(dummy)
For x=1 To 10
a=5
liste(a,x)
Next
EndProcedure
multicore=#False ;für Multi-Threading auf #True ändern
time_start=ElapsedMilliseconds()
For l=1 To 1000000
If multicore=#False
s1(dummy)
s2(dummy)
s3(dummy)
s4(dummy)
s5(dummy)
Else
t1=CreateThread(@s1(),0)
t2=CreateThread(@s2(),0)
t3=CreateThread(@s3(),0)
t4=CreateThread(@s4(),0)
t5=CreateThread(@s5(),0)
WaitThread(t1)
WaitThread(t2)
WaitThread(t3)
WaitThread(t4)
WaitThread(t5)
EndIf
Next
time_stop=ElapsedMilliseconds()
PrintN(Str(time_stop-time_start))
Input()
Code: Alles auswählen
OpenConsole()
Global Dim buffer(5)
Global mutex=CreateMutex()
Global sp1_start=CreateSemaphore()
Global sp1_stop=CreateSemaphore()
Global sp2_start=CreateSemaphore()
Global sp2_stop=CreateSemaphore()
Global sp3_start=CreateSemaphore()
Global sp3_stop=CreateSemaphore()
Global sp4_start=CreateSemaphore()
Global sp4_stop=CreateSemaphore()
Global sp5_start=CreateSemaphore()
Global sp5_stop=CreateSemaphore()
Procedure liste(a,x)
LockMutex(mutex)
buffer(a)=x
UnlockMutex(mutex)
EndProcedure
Procedure s1(dummy)
Repeat
WaitSemaphore(sp1_start)
For x=1 To 10
a=1
liste(a,x)
Next
SignalSemaphore(sp1_stop)
ForEver
EndProcedure
Procedure s2(dummy)
Repeat
WaitSemaphore(sp2_start)
For x=1 To 10
a=2
liste(a,x)
Next
SignalSemaphore(sp2_stop)
ForEver
EndProcedure
Procedure s3(dummy)
Repeat
WaitSemaphore(sp3_start)
For x=1 To 10
a=3
liste(a,x)
Next
SignalSemaphore(sp3_stop)
ForEver
EndProcedure
Procedure s4(dummy)
Repeat
WaitSemaphore(sp4_start)
For x=1 To 10
a=4
liste(a,x)
Next
SignalSemaphore(sp4_stop)
ForEver
EndProcedure
Procedure s5(dummy)
Repeat
WaitSemaphore(sp5_start)
For x=1 To 10
a=5
liste(a,x)
Next
SignalSemaphore(sp5_stop)
ForEver
EndProcedure
t1=CreateThread(@s1(),0)
t2=CreateThread(@s2(),0)
t3=CreateThread(@s3(),0)
t4=CreateThread(@s4(),0)
t5=CreateThread(@s5(),0)
time_start=ElapsedMilliseconds()
For l=1 To 1000000
SignalSemaphore(sp1_start)
SignalSemaphore(sp2_start)
SignalSemaphore(sp3_start)
SignalSemaphore(sp4_start)
SignalSemaphore(sp5_start)
WaitSemaphore(sp1_stop)
WaitSemaphore(sp2_stop)
WaitSemaphore(sp3_stop)
WaitSemaphore(sp4_stop)
WaitSemaphore(sp5_stop)
Next
time_stop=ElapsedMilliseconds()
PrintN(Str(time_stop-time_start))
Input()
Ich denke das dies ein sehr interessantes Thema für dieses Forum ist da die Multicore Programmierung zukünfitg wohl immer mehr zu einsatz kommen wird. Vielleicht weiß ja auch schon jemand mehr darüber, ob es für PB sowas wie OpenMP gibt oder geplant ist.
Hier noch ein Link der sehr treffend beschreibt was ich meine.
http://de.wikipedia.org/wiki/OpenMP
Viele Grüße
Armin