76

Odp: mnozenie liczb 16bitowych

Eru napisał/a:

Jakbyś rozpisał całe liczenie jednej współrzędnej (czyli 3 mnożenia połączone z dodawaniem), zapodaj gdzieś, to zoptymalizuje się

spoko, jutro bede miec czas to napisze, i wkoncu zmienimy teorie w praktyke ;)

i pomyslec ,ze teraz mnozenie 8bit signed*8bit signed to tylko 20cykli a 16signed*8signed to ~60-70cykli o tylu to ja nawet nie marzylem ;)

77

Odp: mnozenie liczb 16bitowych

Co do pomysłu ERU - prościej byłoby gdybyś wszystkie wierzchołki posortował np. względem osi X  - to mnożenie przez którą współrzędną będziesz mnożył pierwszą , gdzie można łatwo zmodyfikować kod - wtedy nie dość że ułatwisz sobie robotę to jeszcze będziesz sobie mógł łatwo wyznaczyć punk przejścia przez zero dla współrzędnej X - wtedy na określonej pozycji licznika modyfikujesz kod - z ujemnej na dodatnią. To ułatwi sprawę , a jednocześnie przyśpieszy obliczenia , nie wspominając że może jeszcze usprawnić kompresję (ale to już offtopic)

78

Odp: mnozenie liczb 16bitowych

kompresję?

https://www.youtube.com/watch?v=jofNR_WkoCE

79

Odp: mnozenie liczb 16bitowych

No tak - sam się w to bawiłem - chyba w reditusie pakowałem obiekty - najpierw na całej tablicy wyznaczałem deltę a potem szło to Powerpackerem - wyniki były oszałamiające ok 20-30% większa kompresja po przeleceniu deltą. W sumie po przesortowaniu tablicy względem jednej z osi delta między sąsiednimi wierzchołkami będzie bardzo mała co spowoduje większą powtarzalność elementów tablicy :) - to samo można zrobić z numerami np pierwszego z rysowanych powiedzmy trójkątów bądź lini - zamiast 1,2,3,1,2,5,6 - 1,1,2,2,3,5,6.

80

Odp: mnozenie liczb 16bitowych

swiety napisał/a:

Co do pomysłu ERU - prościej byłoby gdybyś wszystkie wierzchołki posortował np. względem osi X  - to mnożenie przez którą współrzędną będziesz mnożył pierwszą , gdzie można łatwo zmodyfikować kod - wtedy nie dość że ułatwisz sobie robotę to jeszcze będziesz sobie mógł łatwo wyznaczyć punk przejścia przez zero dla współrzędnej X - wtedy na określonej pozycji licznika modyfikujesz kod - z ujemnej na dodatnią. To ułatwi sprawę , a jednocześnie przyśpieszy obliczenia , nie wspominając że może jeszcze usprawnić kompresję (ale to już offtopic)

No nie do końca. Bo znak X' zależy nie tylko od X, ale też od Y i Z.
Zysk ofkorz może być, ale niewielki, bo jesteśmy w stanie tylko zoptymalizować sprawdzanie znaku X*M1...
Poza tym, nie wiem czy pr0be ma mieć statyczną tablicę punktów, czy np. wiele mniejszych tablic dynamicznie wybieranch, np czy nie będzie robił BSP albo czegoś w tym stylu. Wtedy zysk jeszcze się zmniejszy.
Ale pomysł ze wszech miar ciekawy.

: 404. Stopka not found

81

Odp: mnozenie liczb 16bitowych

No tak w twoich przypadkach to nie zda egzaminu - choć każdą z mniejszych tablic też można posortować i wyznaczyć punkt zerowy - co do dynamicznie zmieniających się tablic to na dobrą sprawę budowane będą bądź co bądź na podstawie statycznych, zresztą wszystko zależy od użytego algorytmu i założeń początkowych - na razie to jest w większości teoria, a pr0be sam sobie wybierze pasujący mu wariant. Wziąłem pod uwagę współrzędną x - nic nie stoi na przeszkodzie żeby była y, bądź z - ale taki algorytm sprawdzi się tylko na jednej współrzędnej.
A licznik i tak będzie jakiś miał (mogę się mylić - ale to będzi masochizm ;) )

Ostatnio edytowany przez swiety (2006-04-08 10:46:47)

82

Odp: mnozenie liczb 16bitowych

manta.univ.gda.pl/~pwisnie/rotate.zip

tu jest przyklad, ktory obraca dowolna ilosc punktow - dla uproszczenia nie ma tam dzielenia przez 128 oraz jest obliczana tylko wspolrzedna X:
x'=M1*vx +  M2*vy + M3*vz


dane sa takie:
M1=$32 M2=$7e M3=$55
vertexnum=1
vx[0]=$01ab vy[0]=$0564 vz[0]=$ff72

M1*vx=$005366
M2*vy=$02a738
M3*vz=$ffd0da

cos zle oblicza M3*vz - wychodzi $fed0da a powinno byc $ffd0da...
zmienilem takze procedure mnozenia tak aby nie korzystala z rejestru X, ktory jest uzywany jako licznik aktualnego wierzcholka...

nie jest to oczywiscie na maxa zopytmalizowane, jak wroce wieczorem to sie jeszcze pobawie ;)

PS: nie wiem czemu, ale najnowszy MADS zle to kompiluje - aktualny przyklad sie wysypuje, dlatego radze go kompilowac starsza wersja (ta dolaczona do archiwum)

Ostatnio edytowany przez pr0be (2006-04-08 15:03:57)

83

Odp: mnozenie liczb 16bitowych

Dobra, to kiedy rzeczona procedurka znajdzie się w Atariki? :)

I Ty zostaniesz big endianem...

84

Odp: mnozenie liczb 16bitowych

pytam sie co sie nie asembluje, bo ja to testuje stara i nowa wersja i wszystko dziala OK

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

85

Odp: mnozenie liczb 16bitowych

http://manta.univ.gda.pl/~pwisnie/mads.zip
TeBe tutaj masz wersje, ktora MADS 1.6.9 zle kompiluje...

MADS 1.6.2

904D    CLC
904E    ADC $867F,X
9051    STA $92 ;MEOLFLG
9053    JMP $9053
9056    BRK
9057    BRK

MADS 1.6.9

904D    CLC
904E    ADC $8600,X
9051    STA $00
9053    BRK
9054    BRK
9055    BRK
9056    BRK
9057    BRK

Ostatnio edytowany przez pr0be (2006-04-09 12:57:41)

86

Odp: mnozenie liczb 16bitowych

teraz widze, sposobem obejscia bledu w wersji 1.6.9 jest umieszczenie RUN START za deklaracja makra, sprawdzam co jest nie tak

ogolnie powinien asemblowac w 4-ech przebiegach a on robi to w dwoch przec co nie aktualizuje adresow zmiennych z makra

Ostatnio edytowany przez tebe (2006-04-09 14:30:26)

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

87

Odp: mnozenie liczb 16bitowych

ok, z wersja 1.7.0 dziala http://mads.atari8.info


1.7.0
- usunięty błąd, który powodował zbyt mała liczbę przebiegów asemblacji
- dodana obsługa pseudo rozkazów JEQ, JNE, JPL, JMI, JCC, JCS, JVC, JVS (makra nie są już potrzebne do ich obsługi)

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

88

Odp: mnozenie liczb 16bitowych

lol - $fed0da

w sumie racja: Doda feee :D

The UNIX Guru`s view of Sex:
unzip; strip; touch; finger; mount; fsck; more; yes; umount; sleep

89

Odp: mnozenie liczb 16bitowych

Napisalem jeszce jedna procke ;), ale ze:
1. po wszystkim sie jej przyjrzalem i idea wyszla prawie identyko do tej eru
(takie tam male roznice - sbc w miejscu adc, adresowanie bez (),y
plus inne wartosci w tablicach)
2. jeszcze jej nie testowalem ;) choc w teorii wyglada OK :P
3. i tak ma to byc optymalizowane pod wielokrotne mnozenie
4. len jestem

wiec na jedno wyjdzie jak ten maly dopalek do eru procki dorzuce
dla wielkrotnego mnozenia - zamiast ladowac do Y 00
(zakladam ze to jest dey czy nie ma juz jest ustawione :P )
potem tya i i tak sumowac z tah,x to robimy

    lda (zch),y
    adc (zdh),y
iah    ldy tah,x
    dey (albo nop)
    tya
    clc
ibh    adc tbh,x

do pojedynczego w tej wersji niestety nie moge tego wsadzic bo przy
adc to czy bylo ujemne sygnalizuje flaga N ale nie C jak przy sbc
wiec ldy tah,x by ja tam "ubilo". No, ale nawet jeden cykl mniej dla
jednokrotnego to zawsze cos :), a dla wielokrotnego jak sie wszedzie
zrobi adresowanie Q,y w miejsce (Z),Y to tez pospada - niewiele
bo niewiele, ale zawsze.

---==<<Sc0rpi0>>==---

90

Odp: mnozenie liczb 16bitowych

OK, znalazlem kwilke, aby pobieżnie przetestować i chyba działa jak w założeniach.

v8      dta b($00)
v16     dta a($0000)
res24   dta b($00),b($00),b($00)

mus8s16 lda #$80
        eor v8
        sta nfix0+1
        sta nfix2+1
        sta nfix4+1
        sta nfix6+1
        eor #$ff
        sta nfix1+1
        sta nfix3+1
        sta nfix5+1
        sta nfix7+1
        sec
        lda #$80
        eor v16+1
        tay
        ldx v16
nfix0   lda ustbl0,x
nfix1   sbc ustbl1,x
        sta res24
nfix2   lda ustbh0,x
nfix3   sbc ustbh1,x
nfix6   ldx sutbh0,y
        bcs *+4
        sec
        dex
nfix4   sbc sutbl0,y
        bcs *+4
        sec
        dex
nfix5   sbc sstbl1,y
        sta res24+1
        txa
nfix7   sbc sstbh1,y
        sta res24+2
        rts

To pojedyncze mnożenie - oczywiście dla wielokrotnego adresowanie ,ndx
jeszcze pare cykli (5+ -> 4+) zaoszczędzi na jedno mnożenie.

---==<<Sc0rpi0>>==---