OSDev

для всех
Текущее время: 12 дек 2017, 09:29

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Поддержка SSE2 в эмуляторах
СообщениеДобавлено: 17 дек 2014, 22:29 

Зарегистрирован: 19 май 2011, 14:54
Сообщения: 73
Написал функцию memzero(), хотел применить SSE2 для оптимизации. Протестировал,
не работает на эмуляторах (VMWare, Bochs, Oracle VirtualBox), падает на первой
SSE-шной инструкции xorpd xmm0, xmm0. При этом на всех реальных компах, которые есть дома, эта же функция
работает без проблем. В чем подвох? Поддержка SSE2 в том же Bochs декларирована... Можно, конечно без SSE2 обойтись... но обидно.

Код:
;                    eax         edx
;void memzero(void * mem, size_t size);
;
    section .text
    [BITS 32]
    global memzero

memzero:
    pushf
    push edi
    cld
    mov edi, eax

    and eax, 0xf
    jz use_sse2
   
 use_stos:
    mov ecx, edx
    mov eax, edx
    and eax, 0x3
    jz zero_dwords
    and eax, 0x1
    jz zero_words
   
    xor eax, eax
    rep stosb
    jmp end
 
zero_words:
    shr ecx, 1
    rep stosw
    jmp end
   
zero_dwords:
    shr ecx, 2
    rep stosd
    jmp end

use_sse2:
    xorpd xmm0, xmm0
    mov ecx, edx
    mov eax, edx
    and eax, 0x7f
    jz fast_sse2
    and eax, 0xf
    jnz use_stos
   
slow_sse2:
    movdqa [edi], xmm0
    add edi, 16
    sub ecx, 16
    jnz slow_sse2
    jmp end
   
fast_sse2:
    movdqa [edi], xmm0
    movdqa [edi + 16], xmm0
    movdqa [edi + 32], xmm0
    movdqa [edi + 48], xmm0
    movdqa [edi + 64], xmm0
    movdqa [edi + 80], xmm0
    movdqa [edi + 96], xmm0
    movdqa [edi + 112], xmm0
    add edi, 128
    sub ecx, 128
    jnz fast_sse2
   
end:
    pop edi
    popf
    ret


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Поддержка SSE2 в эмуляторах
СообщениеДобавлено: 17 дек 2014, 22:47 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1057
Вроде как включить надо.
http://wiki.osdev.org/SSE#Adding_support
Раздел Adding support


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Поддержка SSE2 в эмуляторах
СообщениеДобавлено: 17 дек 2014, 22:58 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1057
Точно:
Том 3А стр 577 глава 13.1.4 Initialization of the SSE/SSE2/SSE3/SSSE3/SSE4 Extensions


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Поддержка SSE2 в эмуляторах
СообщениеДобавлено: 17 дек 2014, 23:05 

Зарегистрирован: 12 май 2012, 14:02
Сообщения: 15
кстати, нет никакой разницы в реальнов процессоре между rep stosb/stosw/stosd. Вторые две внутри процессора умножают ECX на константу и вызывают stosb, так что твои разделения по data size бессмысленны.

Кстати, на счет SSE - при размере в 128 байт и выше почти гарантированно stos будет будет быстрее, чем SSE вариант.
У микрокода есть некий фиксированный overhead, который заметен при для коротких stos и movs, но чем больше длина - тем менее это заметно.
По моему для размера в 128-256 байт тебе уже мало что светит и stos будет быстрее, особенно если ECX на 128 не делиться.

И еще - movdqa сделает очень еффектный #GP если EDI не выровнен на 16 байт. Не вижу проверки в коде :)

Станислав


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Поддержка SSE2 в эмуляторах
СообщениеДобавлено: 18 дек 2014, 21:47 

Зарегистрирован: 19 май 2011, 14:54
Сообщения: 73
pavia писал(а):
Вроде как включить надо.
http://wiki.osdev.org/SSE#Adding_support
Раздел Adding support


Спасибо! Заработало в эмуляторах тоже.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Поддержка SSE2 в эмуляторах
СообщениеДобавлено: 18 дек 2014, 21:54 

Зарегистрирован: 19 май 2011, 14:54
Сообщения: 73
stlw писал(а):
кстати, нет никакой разницы в реальнов процессоре между rep stosb/stosw/stosd. Вторые две внутри процессора умножают ECX на константу и вызывают stosb, так что твои разделения по data size бессмысленны.

Может быть, чего не знаю, того не знаю.

stlw писал(а):
Кстати, на счет SSE - при размере в 128 байт и выше почти гарантированно stos будет будет быстрее, чем SSE вариант.
У микрокода есть некий фиксированный overhead, который заметен при для коротких stos и movs, но чем больше длина - тем менее это заметно.
По моему для размера в 128-256 байт тебе уже мало что светит и stos будет быстрее, особенно если ECX на 128 не делиться.

Вариант с SSE2 задумывается на большие длины. Когда, например надо память под процесс обнулить. Чтобы старого ничего не осталось.

stlw писал(а):
И еще - movdqa сделает очень еффектный #GP если EDI не выровнен на 16 байт. Не вижу проверки в коде :)


Я проверку делаю. В противном случае используется stos.

Код:
    and eax, 0xf
    jz use_sse2


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB