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

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

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

Beitrag 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")
Zuletzt geändert von cxAlex am 03.03.2013 12:10, insgesamt 4-mal geändert.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

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

Beitrag 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ö
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

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

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Antworten