2015-09-12 2 views
0

так им общий нуб на ассемблере и читать их, аассемблере x86

так у меня есть простой код на С

void saxpy() 
{ 
    for(int i = 0; i < ARRAY_SIZE; i++) { 
    float product = a*x[i]; 
    z[i] = product + y[i]; 
} 
} 

и эквивалентный код ассемблера при компиляции с

gcc -std=c99 -O3 -fno-tree-vectorize -S code.c -o code-O3.s 

дает мне следующий код сборки

saxpy: 
.LFB0: 
.cfi_startproc 
movss a(%rip), %xmm1 
xorl %eax, %eax 
.p2align 4,,10 
.p2align 3 
.L3: 
movss x(%rax), %xmm0 
addq $4, %rax 
mulss %xmm1, %xmm0 
addss y-4(%rax), %xmm0 
movss %xmm0, z-4(%rax) 
cmpq $262144, %rax 
jne .L3 
rep ret 
.cfi_endproc 

я понимаю, что разворачивания цикл имеет место , но им не в состоянии понять намерения и идеи за

addq $4, %rax 
mulss %xmm1, %xmm0 
addss y-4(%rax), %xmm0 
movss %xmm0, z-4(%rax) 

Может кто-то объяснить, использование 4, и , что делает заявления означают у-4 (% rax)

+0

4 - размер поплавка –

+0

Может ли сказать, что делает y-4 (% rax), Предположим, что у меня есть цикл для запуска 20 раз. после оптимизации, каково было бы мое статическое и динамическое число insns? – svm

+0

Кроме того, в чем заключается необходимость добавления немедленного значения 4 в регистр rax. который делается в соответствии с заявлением «addq $ 4,% rax» – svm

ответ

1

x, y и z являются глобальными массивами. Вы оставили в конце списка, в котором объявлены символы.

I put your code on godbolt for you, с необходимыми глобальными значениями, определенными (и фиксированными отступом). Посмотрите на дно.

BTW, здесь нет разворота. Есть один скалярный одноточечный мультиплекс и добавление в цикл. Попробуйте с -funroll-loops, чтобы увидеть его разворот.

With -march=haswell, gcc will use an FMA instruction. Если вы не калечите компилятор, оставив -fno-tree-vectorize, а #define ARRAY_SIZE невелик, как 100, он полностью разворачивает петлю с инструкциями FMA ymm в основном 32 байта, заканчивающимися примерно на 16 байт FMA xmm.

Кроме того, в чем необходимость добавления немедленного значения 4 в регистр rax. что делается в соответствии с утверждением «addq $ 4,% Rax»

петля увеличивает указатель на 4 байта, вместо того чтобы использовать масштабированный-индекс режима адресации.


Посмотрите на ссылки на https://stackoverflow.com/questions/tagged/x86. Кроме того, одношаговый код с отладчиком часто является хорошим способом убедиться, что вы понимаете, что он делает.

+0

Эй, Питер, я не понял, что здесь не разворачивается, намного позже, чем я разместил это. Спасибо за разъяснение в отношении 4 байтов. Я должен прочитать эту штуку. , вы могли бы сказать мне лучший способ отлаживать код сборки шаг за шагом, кроме gdb. любой другой компилятор или метод или инструменты, которые я могу использовать? – svm

+0

@sarath: Любой отладчик должен иметь возможность одноэтапного доступа.Приятно, когда регистр, который был изменен предыдущей инструкцией, подсвечивается. Для настройки производительности счетчики производительности ('' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Это зависит от того, что вы пытаетесь сделать, но, глядя на выход asm от оптимизации компиляторов, и выяснение, почему они сделали то, что они сделали, часто полезно. Особенно когда вы сталкиваетесь с ситуациями, когда они * не могут * оптимизировать, вы, возможно, поймете, что вам нужно предоставить компилятору больше информации ('__restrict__', alignment, unsigned) –

Смежные вопросы