Zapis do zmiennej bez odczytu

0

Jeśli w asemblerze na procesorze rodziny “x86_64” zapiszę taką instrukcję:

mov %rax,(%rbx)

gdzie rejestr rax zawiera wcześniej ustawioną wartość, a rejestr rbx zawiera poprawny adres w pamięci, to procesor zapisze tę daną bez odczytu pamięci pod adresem rbx? Mam na myśli na przykład wczytywanie pamięci do “cache” procesora.
Załóżmy, że pod tym adresem znajduje się jakaś ‘flaga’, którą przełączam w algorytmie.

Drugie pytanie. Jeśli instrukcja ma postać

mov %rax,%rdx

gdzie rejestr rdx zawiera jakąś zmienną przechowywaną w rejestrze, to procesor wykona to szybciej niż gdyby testować, czy trzeba ustawiać tę zmienną (np. zerować), a później ustawiać? Przykładowo w takim algorytmie:

while( /* … */ )
{   if(cond)
    {   rdx = 0;
        // …
    }else( rdx != 5 )
    {   rdx++;
        // …
    }else
    {
    }
}

(rdx potrzebuje być tylko ustawiane raz na wartość 0, po zakończeniu odliczania, gdy warunek cond jest pierwszy raz znowu spełniony, ale jest ustawiane zawsze ze względu na algorytm.)

⁑ Ten wątek jest kontynuacją myśli z wątku Przypisywać wartość warunkowo czy bezwarunkowo?.

0
overcq napisał(a):

Jeśli w asemblerze na procesorze rodziny “x86_64” zapiszę taką instrukcję:

mov %rax,(%rbx)

gdzie rejestr rax zawiera wcześniej ustawioną wartość, a rejestr rbx zawiera poprawny adres w pamięci, to procesor zapisze tę daną bez odczytu pamięci pod adresem rbx? Mam na myśli na przykład wczytywanie pamięci do “cache” procesora.

Rejestry procesora to nawet „bardziej niż cache” — jest ich mniej i są jeszcze szybsze, stąd na przykład fajnie jest, jeśli kompilator może złamać calling convention i upchnąć w nich dodatkowe dane. Wypchnięcie gdzieś danych nie wymaga wczytywania starych danych nigdzie; ani do żadnego z rejestrów, ani do jakiejkolwiek szybszej pamięci.

Drugie pytanie. Jeśli instrukcja ma postać

mov %rax,%rdx

gdzie rejestr rdx zawiera jakąś zmienną przechowywaną w rejestrze, to procesor wykona to szybciej niż gdyby testować, czy trzeba ustawiać tę zmienną (np. zerować), a później ustawiać?

Tak. Porównanie danych i skok warunkowy zabiera więcej czasu niż po prostu wepchnięcie gdzieś danych na pałę. Na szczęście kompilatory o tym wiedzą i zazwyczaj uratują Cię przed samym sobą.

1 użytkowników online, w tym zalogowanych: 0, gości: 1