Seite 1 von 1

Beschleunigtes Modulo für x % const(2^n)

Verfasst: 03.03.2013 03:38
von cxAlex
Ein kleines Macro um Modulo - Befehle durch 2. - Potenzen zu beschleunigen. Die Aufruf - Konvention mit der Resultat - Variable als Parameter mag zwar etwas eigen sein, aber nötig da das ganze in eine Procedure gepackt würde den Vorteil durch den nötigen Call wieder verlangsamen (auch wegen der fehlenden Möglichkeit des Inlining im PB - Compiler). Das ganze hat natürlich nur Sinn wenn man massiv Gebrauch von solchen Modulos macht, aber in gewissen Mathematischen Berechnungen kann das schon mal der Fall sein. In meinen Messungen war das Ganze ~ 15% schneller als der native Modulo - Operator:

Code: Alles auswählen

; Modulo Beschleuniger für x % const(2^n)

Macro fastmod(_res, _num, _mod)
  CompilerIf Defined(__fm_mod, #PB_Variable) = #False
    Define.i __fm_mod, __fm_num, __fm_tmp
  CompilerEndIf
  __fm_mod = (_mod) - 1
  __fm_num = _num 
  __fm_tmp = __fm_num & __fm_mod
  If __fm_num < 0
    If __fm_tmp
      _res = (__fm_tmp | ~__fm_mod)
    Else
      _res = 0
    EndIf
  Else 
    _res = __fm_tmp
  EndIf
EndMacro


#n = 100000000

t = ElapsedMilliseconds()
For i = 1 To #n
  x = i%8
Next
t1 = ElapsedMilliseconds()-t

t = ElapsedMilliseconds()
For i = 1 To #n
  fastmod(x, i, 8)
Next
t2 = ElapsedMilliseconds()-t

MessageRequester("","native: " + t1 + " ms" + Chr(13) +"fastmod: " + t2 + " ms")

Re: Beschleunigtes Modulo für x % const(n^2)

Verfasst: 03.03.2013 03:50
von ts-soft

Code: Alles auswählen

  CompilerIf Defined(__fm_mod, #PB_Variable)
    Define.i __fm_mod, __fm_num, __fm_tmp
  CompilerEndIf
Also, wenn __fm_mod definiert ist, soll es definiert werden ?
Abgesehen davon, kannste den ganzen Block streichen, interessiert im Marco nicht.

Gruß
Thomas

Re: Beschleunigtes Modulo für x % const(n^2)

Verfasst: 03.03.2013 04:15
von STARGÅTE
Also bei benötigt deine Macroversion sogar nur 1/4 der Zeit von % also knapp 75% schneller.
native: 1794 ms
fastmod: 421 ms
Allerdings würde ich, wenn ich weiß ich brauche x Mod 8, gleich nur x & 7 schreiben.
Vorteil (zumindest kann man es so sehen) ist dort sogar, dass ich auch bei -2 MOD 8 (-2&7) = 6 bekomme, statt -2.

Im übrigen solltest du mit "solchen" Macros vorsichtig sein, denn sie sind weder verschachtelbar, noch threadsicher.
Und damit EnableExplicit funktioniert, solltest du es so machen:

Code: Alles auswählen

 CompilerIf Defined(__fm_mod, #PB_Variable) = #False
    Threaded.i __fm_mod, __fm_num, __fm_tmp
  CompilerEndIf

Re: Beschleunigtes Modulo für x % const(n^2)

Verfasst: 03.03.2013 09:40
von WPö
Die Überschrift "Beschleunigtes Modulo für x % const(n^2)" deckt sich nicht mit dem Beitragsinhalt. Der Unterschied zwischen n^2 und 2^n sollte gerade Programmierern klar sein. Bitte Titel anpassen, damit Anfänger nicht in die Wüste geschickt werden und die Suche halbwegs sinnvoll eingesetzt werden kann!

Gruß - WPö

Re: Beschleunigtes Modulo für x % const(2^n)

Verfasst: 03.03.2013 12:00
von cxAlex
Ah, Entschuldigung. Das mir das nicht selbst gleich ins Auge gesprungen ist :P War ja doch halb 3 in der Früh :oops:
Das Threaded werd ich im 1. Post einbauen, danke.
ts-soft hat geschrieben: Also, wenn __fm_mod definiert ist, soll es definiert werden ?
Abgesehen davon, kannste den ganzen Block streichen, interessiert im Marco nicht.
Da fehlt ein Not, ich habs bemerkt als ich den Source gepostet habe und in der IDE geändert aber nicht im Post, wie gesagt halb 3 :P Und doch das muss ins Macro denn beim 1. Mal müssen die Variablen definiert werden, in dem Fall sind das Variablen und keine Macro - Ersetz Parameter.

Gruß, Alex