MMX, SSE и т.д. в VB

Для неординарных вопросов. Если вы опытный программист, попавший в трудную ситуацию, — вам сюда.

Модератор: gaidar

Правила форума
Этот раздел не предназначен для того, чтобы вы адресовали свою проблему профессионалам.
Этот раздел предназначен для профессионалов, которые столкнулись с проблемой и не могут решить ее самостоятельно.
Если вы считаете себя профессионалом, а свою проблему сложной — вам сюда.
Если модератор посчитает, что вы ошиблись, то на первый раз он перенесет ваше сообщение в основной раздел без последствий для автора. Во второй раз тема будет закрыта, а автору будет выписано нарушение. В третий раз автор будет забанен.
Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

MMX, SSE и т.д. в VB

Сообщение Vovik » 29.06.2007 (Пт) 2:18

Собсно, это реально на VB? :roll:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.06.2007 (Пт) 9:24

Что конкретно нужно?
Изображение

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: MMX, SSE и т.д. в VB

Сообщение jangle » 29.06.2007 (Пт) 12:10

Vovik писал(а):Собсно, это реально на VB? :roll:


Странный вопрос, если вспомнить, что в VB нет инлайн асма. Можно использовать прошивку в код VB скомпилированных асмовых бинарников внешним компилятором. Тогда надо спрашивать, реально ли MMX/SSE например в MASM? Ответ да реально. Но очень не удобно, все это отлаживать в VB проекте.
Кстати, можно использовать компилятор PB 8 версии (написать DLL и подключить к твоему проекту), PB знает инструкции MMX. SSE - к сожалению нет, поэтому надо извращатся через !db, и писать макросы, например:

pavgb mm0,mm1 => !db &h0f, &he0, &hc1 'будет иметь такой вид

Криво конечно, но намного удобнее чем секс с прошивкой асмовых бинарников в VB код.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 29.06.2007 (Пт) 13:05

Можно не извращаться и написать DLL на асме(можно на VC). А с подобными извращениями можно и в VB асм-код встроить без DLL вообще.
Изображение

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 29.06.2007 (Пт) 14:29

tyomitch писал(а):Что конкретно нужно?
Чисто средствами VB проверить на поддержку MMX, SSE ну и соответственно заменить CopyMem.. :roll:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.06.2007 (Пт) 14:38

Чисто средствами VB не удастся.
Чисто проверить можно вызовом CPUID, например подобным этому способом. Там используется API CallWindowProc.
Изображение

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 29.06.2007 (Пт) 15:41

Чисто средствами VB проверить на поддержку MMX, SSE ну и соответственно заменить CopyMem..


Никак. Хотя если в VB был асм, проверку устроить как два пальца об асфальт, очень просто. А так, х.з. как надо извращаться.

Если нужно, код проверки на асме:

Код: Выделить всё
#Compile Exe
#Dim All

Function CPU (ByVal TI As Long) As Long
    #Register None
    Local L As Long
    ! pushad
    ! pushfd
    ! mov eax, 1
    ! cpuid
    ! mov L, edx
    ! popfd
    ! popad
    L = IsTrue(Bit(L,  TI) = 1)
    Function =  L
End Function

Function PBMain () As Long
  If CPU(23)<0 Then MsgBox "Поддерживатеся MMX"
  If CPU(25)<0 Then MsgBox "Поддерживатеся SSE"
  If CPU(26)<0 Then MsgBox "Поддерживатеся SSE2"
  If CPU(0)<0 Then MsgBox  "Поддерживатеся SSE3"
  If CPU(28)<0 Then MsgBox "Поддерживатеся Hyper Threading Technology"
  If CPU(30)<0 Then MsgBox "Поддерживатеся 3DNow extensions"
  If CPU(31)<0 Then MsgBox "Поддерживатеся 3DNow"
  If CPU(7)<0 Then MsgBox  "Поддерживатеся Speed Step Technology"
  If CPU(29)<0 Then MsgBox "Поддерживатеся Thermal Monitor V1"
  If CPU(8)<0 Then MsgBox  "Поддерживатеся Thermal Monitor V2"
End Function
                 

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 29.06.2007 (Пт) 17:03

А что скажите про это? :roll:
Вложения
Copy_memor16711211122003.zip
(20.93 Кб) Скачиваний: 301
Последний раз редактировалось Vovik 29.06.2007 (Пт) 20:18, всего редактировалось 1 раз.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.06.2007 (Пт) 17:36

Что это не чистый VB, ессно.
Там для вызова асмовских вставок перезаписывают VTbl класса.
Ничем не лучше и не проще, чем с CallWindowProc.
Изображение

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 29.06.2007 (Пт) 20:17

tyomitch писал(а):Что это не чистый VB, ессно.
Там для вызова асмовских вставок перезаписывают VTbl класса.
Ничем не лучше и не проще, чем с CallWindowProc.
Темыч, если тебе не сложно, не мог бы ты наваять примерчик... :roll:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.06.2007 (Пт) 20:48

Вот перевод для кода от jangle, которому как два пальца.

Код: Выделить всё
Option Explicit

Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (lpfn As Any, ByVal param) As Long

Function Cpuid1() As Long
Cpuid1 = CallWindowProc(ByVal "j" + Chr$(1) + "XS" + Chr$(15) + Chr$(162) + "[" + Chr$(146) + Chr$(194) + Chr$(16), Null)
End Function

Sub Main()
  If Cpuid1 And 2 ^ 23 Then MsgBox "Поддерживатеся MMX"
  If Cpuid1 And 2 ^ 25 Then MsgBox "Поддерживатеся SSE"
  If Cpuid1 And 2 ^ 26 Then MsgBox "Поддерживатеся SSE2"
  If Cpuid1 And 2 ^ 0 Then MsgBox "Поддерживатеся SSE3"
  If Cpuid1 And 2 ^ 28 Then MsgBox "Поддерживатеся Hyper Threading Technology"
  If Cpuid1 And 2 ^ 30 Then MsgBox "Поддерживатеся 3DNow extensions"
  If Cpuid1 < 0 Then MsgBox "Поддерживатеся 3DNow"
  If Cpuid1 And 2 ^ 7 Then MsgBox "Поддерживатеся Speed Step Technology"
  If Cpuid1 And 2 ^ 29 Then MsgBox "Поддерживатеся Thermal Monitor V1"
  If Cpuid1 And 2 ^ 8 Then MsgBox "Поддерживатеся Thermal Monitor V2"
End Sub
Изображение

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 30.06.2007 (Сб) 0:33

Простите, но я не совсем понимаю, как копировать данные с помощью mmx, sse - если держит? :roll: Кстати, прога не показывает поддержку 3DNow и напротив, показывает, что мой проц держит SSE3, хотя EVEREST говорит обратное... :shock:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 30.06.2007 (Сб) 9:26

Vovik писал(а):Кстати, прога не показывает поддержку 3DNow и напротив, показывает, что мой проц держит SSE3, хотя EVEREST говорит обратное... :shock:

Ну откуда я знаю, может у них в PB биты в обратном порядке нумеруются? :roll:
Пусть дальше jangle разбирается, которому как два пальца.
Изображение

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 30.06.2007 (Сб) 13:11

Vovik писал(а):Кстати, прога не показывает поддержку 3DNow и напротив, показывает, что мой проц держит SSE3, хотя EVEREST говорит обратное... :shock:


Может биты перепутал, надо поднимать документацию по процам. MMX и SSE правильно отображаются?

tyomitch писал(а):Ну откуда я знаю, может у них в PB биты в обратном порядке нумеруются? :roll:
Пусть дальше jangle разбирается, которому как два пальца.


Нужно отключить автоматическое распределение регистров процессора директивой #Register None, без этого программа работает неправильно.

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 30.06.2007 (Сб) 16:54

MMX и SSE определяет правильно.... Народ, мне даже не важно смотреть, что там поддерживается... Покажите пож-ста пример, как копировать из одной переменной в другую с помощью SSE и MMX :cry:

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 30.06.2007 (Сб) 19:10

Тебе это так, для эксперимента? Или есть практическое применение?
MMX и SSE - они ведь только дают 64 / 128 битные регистры.. За счет этого копирование происходит немного быстрее, но это имеет смысл при большом объеме копируемых данных.
Мало того, все равно для их использования тебе придется писать процедурку на ассемблере, и встраивать в программу на vb.

Есть подозрение, что с практической точки зрения игра не стоит свеч.
label:
cli
jmp label

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 11.07.2007 (Ср) 1:47

iGrok писал(а):Тебе это так, для эксперимента? Или есть практическое применение?
MMX и SSE - они ведь только дают 64 / 128 битные регистры.. За счет этого копирование происходит немного быстрее, но это имеет смысл при большом объеме копируемых данных.
Мало того, все равно для их использования тебе придется писать процедурку на ассемблере, и встраивать в программу на vb.

Есть подозрение, что с практической точки зрения игра не стоит свеч.
А если это использовать в цикле, как думаешь, будет выигрышь (например, в игре)?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 12.07.2007 (Чт) 9:21

Vovik
как копировать из одной переменной в другую с помощью SSE и MMX

MMX:
Код: Выделить всё
mov esi, Source
mov edi, Dest
mov ecx, CntOfQWords
lab0:
movq mm0, [esi]
movq [edi], mm0
add esi, 8
add edi, 8
loop lab0

Но сомневаюсь, что это будет быстрее, чем обычный rep movsd. Ты не там ищешь потерю скорости.

Правка:
Source и Dest передаются ByRef, CntOfQWords - ByVal.
Последний раз редактировалось Mikle 12.07.2007 (Чт) 13:30, всего редактировалось 1 раз.

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 12.07.2007 (Чт) 12:05

Спасибо Майкл за код, я уже решил не заморачиваться...
Mikle писал(а):Но сомневаюсь, что это будет быстрее, чем обычный rep movsd. Ты не там ищешь потерю скорости.
Знаешь, я уже хватаюсь за все, что только можно.... Оптимизирую все, что могу... Вот и решил поэксперементировать с mmx, sse... :)

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 12.07.2007 (Чт) 14:05

А какой объем? Если ты пару гигов туда-сюда кидаешь - то будет быстрее..
label:
cli
jmp label

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 15.07.2007 (Вс) 18:13

iGrok писал(а):А какой объем? Если ты пару гигов туда-сюда кидаешь - то будет быстрее..
Все дело в том, что копирование данных происходит в цикле и, если, и копирование (допустим перекидывание из массива в массив) будет происходить быстрее, то время цикла уменьшится, что даст выигрыш в фпс. :)


Вернуться в Раздел для Профессионалов

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

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

    TopList  
cron