LINUX.ORG.RU

оптимизация работы с векторами

 , , ,


0

7

Есть такая структура

struct f
{
...
    // здесь хранятся индексы другого вектора
    std::vector<size_t> ir;
    std::vector<size_t> ic;
...
};

f l;
size_t k;

В одной функции есть строчка

1. size_t i = l.ir[k];

AMDшный CodeXl расскрывает по этой строчке такой код:

mov edi,ecx
shl edi,04h
mov [ebp-10h],edi
----- break -----
mov eax,[ebx+1ch]
mov ebx,[ebx+4ch]
mov edi,[ebp-18h]
mov [ebp-20h],eax
----- break -----
mov eax,[ebp-20h]
lea ecx,[edx*4+00000000h]
---- break -----
mov eax,[eax+ecx]

И вторая строчка

2. size_t j = l.ic[k];

Компилируется в

xor esi,esi
mov [ebp-10h],esi
----- break -----
movsd xmm4,[ebp-34h]
----- break -----
movsd xmm5,[ebp-3ch]
----- break -----
mov eax,[edi+40h]
----- break -----
lea edi,[eax+ebx*4]
mov ecx,ebx
shl ecx,05h
sub edx,ebx
mov ebx,[ebp-14h]
lea ecx,[ecx+00h]
mov eax,[edi]
add edi,04h

И первый вариант, судя по логам профайлера, выполняется в 3 раза дольше.

Почему первый раз выполняется дольше?

Почему вообще ассемблерный код у этих вариантов отличается?


xmm4 - 128 бит
eax - 32 бита.
size_t, — это 64-разрядные значения в 64-разрядных операционных системах.

Получается, копирование в 32х разрядые регистры копируется х64.

Если речь идет о X64 версии

art_corp ()
Ответ на: комментарий от art_corp

прошу прощения, забыл указать, что компилируется для 32битной архитектуры

jcdr ()

у тебя какой-то странный компилятор

#include <vector>

struct { std::vector<size_t> ir, ic; } l;
volatile size_t k, i, j;

int main() {
    i = l.ir[k];
    j = l.ic[k];
}
g++ -m32 -O2 -S test.cpp
movl    _k-L1$pb(%eax), %ecx
movl    _l-L1$pb(%eax), %edx
movl    (%edx,%ecx,4), %ecx
movl    %ecx, _i-L1$pb(%eax)
movl    _k-L1$pb(%eax), %ecx
movl    (_l-L1$pb)+12(%eax), %edx
movl    (%edx,%ecx,4), %ecx
movl    %ecx, _j-L1$pb(%eax)
mix_mix ★★★★★ ()
Ответ на: комментарий от art_corp

Вот набуя ему смотреть профайлер от интела? Ты понял вообще о чем он спрашивал? При чем тут профайлер?

anonymous ()
Ответ на: комментарий от anonymous

И первый вариант, судя по логам профайлера, выполняется в 3 раза
>>дольше.

Чтобы проверить, действительно ли код в 3 раза медленнее.
Точно узкое место здесь?

art_corp ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.