Size: a a a

Ассемблер

2021 September 01

d

disba1ancer in Ассемблер
мы дважды загружаем конец в кеш, если вдруг сетим невмещающийся ни в какие кеши кусок
источник

d

disba1ancer in Ассемблер
а покажи самое первое место с такой зависимостью? и кстати, у первого меньше зависимостей по регистрам?
источник

E

Entusiast in Ассемблер
Не уверен, что это так
источник

E

Entusiast in Ассемблер
🤨Какое самое первое место?
источник

d

disba1ancer in Ассемблер
самая первая стручка где есть такая зависимость
источник

E

Entusiast in Ассемблер
mov     [cur + size - 2], ax ; read ecx, edi
lea     size, [size - 2] ; write ecx, only after the ecx has already been read

shr     size, 2
rep stos [cur], eax ; wait ecx
источник

d

disba1ancer in Ассемблер
ну можно сначала вычесть, а потом читать, но такие фишки только в первом алгоритме
источник

E

Entusiast in Ассемблер
Правда в новых процессорах есть много дополнительных внутренних регистров, вроде уже начиная с Pentium 1, процессор может просто убрать подобную зависимость, но я не уверен, когда это относится к частым случаям, всё-таки процессор - не интерпретатор.
; Example 2.4. Register renaming
mov eax, [mem1]
mov ebx, [mem2]
add ebx, eax
imul eax, 6
mov [mem3], eax
mov [mem4], ebx
Тут будут использоваться два временных регистра для EAX - ввод, вывод
"The first instruction in the above example will
assign one temporary register to EAX. The second instruction is putting a new value into
EAX, so a new temporary register will be assigned here. In other words, the multiplication
instruction will use two different registers, one for input and another one for output.

Assume, now, that [MEM1] is in the cache, while [MEM2] is not. This means that the
multiplication can start before the addition. The advantage of using a new temporary
register for the result of the multiplication is that we still have the old value of EAX, which
has to be kept until EBX is ready for the addition. If we had used the same register for the
input and output of the multiplication, then the multiplication would have
to wait until the
loading of EBX and the addition was finished
.
After all the operations are finished, the value in the temporary register that represents the
last value of EAX in the code sequence is written to a permanent EAX register. This process
is called retirement."
Поэтому зависимость будет убрана, процессор сделал всё сам
источник

d

disba1ancer in Ассемблер
я правда думаю, а надо ли вообще инициализировать на максимум эти выравнивающие выравнивающие инструкции
источник

d

disba1ancer in Ассемблер
а что по твоему лучше в этом случае?
источник

E

Entusiast in Ассемблер
С моей стороны легче подсказать, в чём проблема, а не переписать код
источник

d

disba1ancer in Ассемблер
но я всё равно до конца не понял что лучше, сначала изменить регистр, а потом потом записать по адресу с ним или наоборот
источник

E

Entusiast in Ассемблер
Просто сделай так, чтобы следующая инструкция не ждала значение регистра, это можно решить, вставив между ними ещё какую-нибудь работу, с абсолютно другим значением. (Выиграть место для выполнения какой-то другой части алгоритма)
Или просто забей, потому что отставка есть почти на всех процесорах, выше Pentium 1 (MMX)
Но нужно надеяться, чтобы процессор смог правильно распределить временные регистры на твои 4 листинга с зависимостью
источник

d

disba1ancer in Ассемблер
а если какой-нибудь mov поместить между test и jcc это может дать чего-нибудь?
источник

E

Entusiast in Ассемблер
Зачем тебе он там?
источник

d

disba1ancer in Ассемблер
хз... хотя это сломает алгоритм...
источник

E

Entusiast in Ассемблер
Ну в остальном, если не брать в счёт зависимости, тогда всё нормально
(Но это я про инструкции, а вот про сам алгоритм - как он будет работать с большими, маленькими данными - не знаю)
источник

d

disba1ancer in Ассемблер
в обоих алгоритмах?
источник

E

Entusiast in Ассемблер
Про первый, второй детально не рассматривал
источник

d

disba1ancer in Ассемблер
ясно
источник