Сколько байт занимают инструкции перечисленные ниже: add imul sub idiv paddw pmullw psubw FADD FMUL FSUB Fdiv addss mulss subss Divss ADDSD MULSD SUBSD DIVSD ???
locki К сожалению, Intel-архитектура - это CISC по полной программе, то есть нельзя сказать, что инструкция занимает сколько-то байт. Та же ADD може занимать в зависимости от формы от 2-х до 14-ти байт. Как раз тот случай, когда без мануалов не обойтись. Например IA-32 Intel® Architecture Software Developer’s Manual Volume 2: Instruction Set Reference, APPENDIX B: INSTRUCTION FORMATS AND ENCODINGS. или вкратце здесь есть общий формат для всех инструкций.
ни хрена не понял. А можете ответить ск-ка они занимают если ни работают с eax,ebx {add eax,ebx...} и повторяются в цикле много раз. Код (Text): for i:=1 to 1000000 do asm add eax,ebx ... end; Сколько можно раз их поставить в цикле (развернуть цикл) так, чтобы это было оптимально для Pentium4
locki add eax,ebx обычно занимает 2 байта и этот размер не зависит от количества повторений в цикле А что мы оптимизируем? Алгоритмически этот цикл можно заменить инструкцией умножения. А цикл лучше всего сначала выровнять.
locki Разворот в основном используется для уменьшения относительного вклада операций управления циклом (декремент счетчика и переход) в общее время выполнения одного цикла. Поэтому разворачивать нужно до разумного предела, пока вклад управления не снизится до достаточно малого значения (IA-32 рекомедуют до 10%). Дальнейший разворот практически ничего не дает для повышения быстродействия, но дольше декодируется при первом проходе а потом занимает лишнее место в T-кэше. Для супертонкого цикла как у тебя для оптимизации быстродействия на P4 вполне достаточно разворота на 8-10 (максимум на 15-16)
-цикл лучше всего сначала выровнять. как это сделать align 16 в дельфи нет - ругается! -Дальнейший разворот практически ничего не дает для повышения быстродействия, но дольше декодируется при первом проходе а потом занимает лишнее место в T-кэше. Для супертонкого цикла как у тебя для оптимизации быстродействия на P4 вполне достаточно разворота на 8-10 (максимум на 15-16) а можно точное(оптимально для T-кэша P4)количество для каждой инструкции от add, ..., до divsd.
а что, были случаи? [offtop] - Синус равен, предположим 1.5... - товарищ прапорщик, синус не может быть больше 1! - что вы знаете, в военное время и до 3-х доходит! [/offtop] locki Еще раз повторяю - все зависит от формы. Если все в регистрах, то арифметические операции занимают, как правило, 2 байта, fpu - 2, mmx - 3, sse - 3(векторные) или 4(скалярные), sse2 - 4 байта. При использовании операндов в памяти могут добавляться префиксы, sib-байт, смещение. Приведи полные формы инструкций - тогда можно будет точно сказать.
А какой обьем Т-кэша у Нортвуда и у Прескота? 12288 байт! Т.е. для add eax,ebx оптимально ~6144 повторений для MMX и FPU ============= 4096 для SSE2=================== 3072 я правильно понял??? или Т-кеш = 2048 блоков 1 блок=6байт Максимальная длина трассы составляет 64 блока 64*6байт = 384байта и уже 384 делить на кол-во байт занимаемых инструкцией????
Размер T-кэша измеряется не в байтах, а в микрооперациях (мопах) - 12К мопов, объединенных в блоки по 6 мопов. Мопы и байты исходного кода напрямую не связаны. Например и двухбайтовая add r32,r32 и 6-байтовая add r32,imm32 состоят из одного мопа. Но хитростей в организации T-кэша предостаточно и совершенно не понятно о какой оптимальности тут может идет речь и нафиг тебе сдалось забивать весь T-кэш одним циклом ) Ведь прежде чем инструкции попадут в T-кэш их нужно сначала декодировать, а на простых операциях типа add r32,r32 декодер P4 работает в 3 раза медленнее, чем извлечение готовых мопов из T-кэша. Это при условии, что код уже находится в L2. А если нет, то плюс время на загрузку кода из ОЗУ. Простая задачка: частота ОЗУ в 8-10 раз ниже ЦПУ, в P4 данные из ОЗУ грузятся секторами по 128 байт = 16 чанков по 8 байт. Прикинь число тиков только на передачу 128 байт (не считая потерь на управление транзакциями) и наскоько оно больше чем время декодирования (1 инструкция за такт)