2011-08-17 8 views
7

PytanieDobre zasoby do korzystania z Assembly w Delphi?

Czy są jakieś zasoby, aby nauczyć się używać zestawu w Delphi?

Informacja Tło

Znalazłem i przeczytać kilka walnego zgromadzenia i zestaw instrukcji odniesienia (x86, MMX, SSE, itp). Ale trudno mi zastosować tę informację w Delphi. Ogólne rzeczy, takie jak jak uzyskać wartość właściwości klasy itp.

Chciałbym mieć opcję używać zespołu podczas optymalizacji kodu.

rozumiem:

  • To będzie trudno pokonać kompilatora.
  • Wysokopoziomowe techniki optymalizacji znacznie zwiększają wydajność o kilka rzędów wielkości w stosunku do optymalizacji montażu niskiego poziomu. (Takie jak wybór różnych algortów, buforowanie itp.)
  • Profilowanie jest niezbędne. Używam Sampling Profiler do analizy rzeczywistej wydajności i liczby cykli procesora dla szczegółów niskiego poziomu.

Jestem zainteresowany nauczenie się montaż w Delphi, ponieważ:

  • Nie zaszkodzi mieć innego narzędzia z przybornika.
  • Pomoże to w zrozumieniu danych wyjściowych zespołu generowanego przez kompilator.
  • Zrozumienie, co robi kompilator, może pomóc w napisaniu lepszego kodu paskowego.
  • Jestem ciekawy.
+3

Po prostu napisanie go w zespole, nie przyspieszy. Pisanie go w zespole w sposób mądrzejszy/szybszy, niż myśli kompilator, może. Funkcja polegająca na tym, że uzyskanie własności klasy prawdopodobnie nie zabiera czasu, manipulacje wartością właściwości są prawdopodobnie tym, co chcesz podjąć podczas montażu. – PtPazuzu

+2

Nie sądzę, że istnieją jakieś książki Delphi-plus-asembler. Chciałbym pobrać wartości z właściwości klas, używając zwykłego kodu paskowego, zapisać wynik w zmiennej lokalnej, a następnie użyć odwołania do zmiennej lokalnej w moim wbudowanym asemblerze, na przykład. Powiązane pytanie do książek ogólnych na X86 asm; http: //stackoverflow.com/questions/4845/good-x86-assembly-book –

+0

@PtPazuzu: Tak, manipulowanie wartościami jest celem. Ale najpierw pomoże zrozumieć podstawy. Ostatecznie szukam w kierunku SSE jako źródła potencjalnych przyspieszeń. Delphi w ogóle nie korzysta z instrukcji SSE? – Shannon

Odpowiedz

12

Tutaj jest zasobem, który może być pomocny ...

www.guidogybels.eu/docs/Using%20Assembler%20in%20Delphi.pdf

(chciałem dodać komentarz do @Glenn tej informacji, ale jestem zmuszony do korzystania z mechanizmu odpowiedź, jestem nowy to forum i za mało Repów ...)

+1

Dzięki @daemon! –

+1

+1 za wzmiankę o tym wspaniałym artykule. Nie spodziewałem się, że nadal będzie online, ponieważ Guido nie wydaje się już używać Delphi. –

2

Najprostszym rozwiązaniem jest zawsze kodowanie go w paskale i patrzenie na wygenerowany asembler.

W zależności od prędkości, asembler jest zwykle tylko na plusie w ciasnych pętlach, aw ogólnym kodzie prawie nie ma poprawy. W moim kodzie mam tylko jeden element asemblera, a korzyść wynika z przekodowania operacji wektorów zmiennoprzecinkowych w stałym punkcie SSE. Nasycenie dostarczane przez zestawy instrukcji SIMD jest dodatkowym bonusem.

Co gorsza, bardzo nieuprawniony kod asemblera pływający po sieci jest w rzeczywistości wolniejszy od pascalowych odpowiedników na nowoczesnych procesorach, ponieważ kompromisy procesorów zmieniały się z czasem.


Aktualizacja:

Następnie wystarczy wczytać właściwość klasy w lokalnej var w prologu swojej procedury przed wejściem do pętli asemblera lub przenieść assembler do innej procedury. Wybierz swoje walki.

Studiowanie RTL źródło/VCL może również wydajność pomysły jak uzyskać dostęp do pewnych konstrukcji.

Przy okazji, nie każda optymalizacja niskiego poziomu odbywa się za pomocą asemblera.Na poziomie Pascala z pewną wiedzą o wskaźniku można też wiele zrobić, a takie rzeczy jak optymalizacja pamięci podręcznej mogą czasami być wykonywane również na poziomie Pascal (patrz np. Cache optimization of rotating bitmaps)

+0

Nie interesuje mnie asembler dla ogólnego kodu. Moje aplikacje przetwarzają dźwięk w czasie rzeczywistym. Często używam ciasnych pętli podczas pracy z danymi audio. W zależności od aktualnej aplikacji, dążę do mniejszego niż 2-5% wykorzystania procesora na nowoczesnym CPU (tylko w sekcjach w czasie rzeczywistym, nie dbam o to, aby procesor był usuwany podczas sekcji poza czasem rzeczywistym). Wszystkie "optymalizacje" są również oznaczone znakiem "ławy". Nie stosuję niczego na ślepo. – Shannon

+0

Dzięki nowym informacjom zaktualizowałem nieco odpowiedź. –

+0

Dzięki Marco. Odczyt optymalizacji pamięci podręcznej jest interesujący. +1 – Shannon

6

Większość optymalizacji polega na tworzeniu lepszych algorytmów: zwykle tam można uzyskać Można uzyskać poprawki prędkości rzędu "rzędu wielkości".

Świat montażu x64 to duża zmiana w świecie montażu x86. Co oznacza, że ​​wraz z wprowadzeniem x64 w Delphi w XE2 (już wkrótce), będziesz musiał napisać cały kod instalacyjny dwukrotnie.

Uzyskanie lepszego algorytmu w Delphi zwalnia Cię z pisania tego kodu instalacyjnego.

Głównym obszarem, w którym pomoc może pomóc montaż (ale często inteligentnie spreparowany kod Delphi również bardzo pomaga) jest niskoobszarowe przekierowanie bitowe/bajtowe, na przykład podczas szyfrowania. Z drugiej strony, FastMM (szybki menedżer pamięci dla Delphi) ma prawie cały kod napisany w Delphi.

Makro już napisano: rozpoczynanie od zdemontowanego kodu jest często dobrym początkiem. Optymalizacje montażu mogą jednak zająć dużo więcej.
Przykładem, który można wykorzystać jako punkt wyjścia, jest na przykład SynCrypto unit, który ma opcję użycia Delphi lub kodu zespołu.

+0

+1 dla "Większość optymalizacji polega na tworzeniu lepszych algorytmów" - to główna zasada. –

+0

Rozumiem, że optymalizacja jest zazwyczaj najlepiej wykonywana przez środki wysokiego poziomu, takie jak wybory algorytmów, ale nie sądzę, że neguje to wartość wiedzy na temat używania zestawu w Delphi. – Shannon

+0

Być może najlepsze korzyści z tworzenia kodu asemblera nie mają nic wspólnego z samym algorytmem (na przykład zły quicksort bije w pełni zoptymalizowany sortowanie bąbelkowe za każdym razem). To, z czym ma do czynienia, to sposób wyrażania tego algorytmu. Na przykład możesz używać instrukcji CPU (nawet x86), których Delphi nie używa, jeśli są wywoływane (ADC to świetny przykład). Lub kodujesz w taki sposób, że zachowujesz dowolne zmienne w rejestrach. I nawet jeśli nie kodujesz w asemblerze, znajomość tego może być przydatna przy tworzeniu szybszego kodu Delphi. – Glenn1234

5

Sposób, w jaki czytam twoją pocztę, nie patrzysz za bardzo na zasoby asemblera jako zasoby, aby wyjaśnić, w jaki sposób deklaracje Delphi są uporządkowane w pamięci, abyś mógł uzyskać do nich dostęp za pośrednictwem asemblera. Jest to naprawdę trudne do znalezienia, ale nie niemożliwe.

Here to dobry zasób, w którym zacząłem rozumieć, w jaki sposób Delphi konstruuje swoje deklaracje. Ponieważ asembler angażuje się tylko z dyskretnymi adresami danych do typów danych zdefiniowanych przez CPU, będziesz dobrze z każdą strukturą Delphi, dopóki ją zrozumiesz i uzyskasz do niej prawidłowy dostęp.

Jedyny inny problem dotyczy sposobu interakcji z procedurą Delphi i nagłówkami funkcji, aby uzyskać pożądane dane (zakładając, że chcesz zrobić asembler za pomocą wbudowanego narzędzia Delphi), ale to wymaga zrozumienia standardowego wywołania funkcji konwencje. This i this będą przydatne w tym celu w ich zrozumieniu.

Teraz używanie rzeczywistego asemblera (połączone pliki OBJ) w przeciwieństwie do wbudowanego asemblera to inny temat, który będzie różny w zależności od wybranego asemblera. Możesz również znaleźć informacje na ten temat, ale jeśli masz jakieś zainteresowanie, zawsze możesz zadać to pytanie.

HTH.

+0

Dzięki Glenn! To jest dokładnie ten rodzaj informacji, którego szukam! – Shannon

+0

Czy korzystanie z połączonych plików OBJ przez zespoły wbudowane ma swoje zalety? (Czy powinno to być inne pytanie?) – Shannon

+0

@Shannon Jak rozumiem, główną zaletą jest to, że możesz uzyskać wsparcie dla instrukcji w "prawdziwym asembler", których możesz nie dostać w asemblerze Delphi. Co dziwne, nigdy nie miałem problemów z włączaniem wywołań do "prawdziwych" funkcji asemblera. To zależy od tego, czy otrzymasz coś, czego potrzebujesz z produktu asemblera, że ​​nie możesz wydostać się z Delphi. – Glenn1234

4

Aby efektywnie używać BASM, musisz znać zarówno (1) jak Delphi robi rzeczy na niskim poziomie i (2) montażu. W większości przypadków nie znajdziesz obu tych rzeczy opisanych w jednym miejscu.

Jednakże, Dennis Christensen's BASM for beginner i ten Delphi3000 article idą w tym kierunku. W przypadku bardziej szczegółowych pytań, oprócz Stackoverflow, również przydatne jest Embarcadero's BASM forum.

Powiązane problemy