Align16, возможно ли?

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

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

Align16, возможно ли?

Сообщение Mikle » 01.01.2010 (Пт) 15:23

Имею 4D вектора и матрицы. Перемножаю в DLL на C++, для большей производительности желательно, чтобы вектора и матрицы были выровнены в памяти по 16-ти байтной границе, Можно ли это сделать?

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Align16, возможно ли?

Сообщение Nord777 » 01.01.2010 (Пт) 19:47

Перемножаю в DLL на C++

Мне кажется ты тем самым уменьшил быстродействие.
Тестировал? Если вычисления будут в managed коде и в той же сборке?
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

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

Re: Align16, возможно ли?

Сообщение Mikle » 01.01.2010 (Пт) 20:58

Тестировал, если перемножать не по одному, у C++ хороший выигрыш даже без SSE.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Align16, возможно ли?

Сообщение Nord777 » 01.01.2010 (Пт) 21:20

А можно увидеть не сильно перегруженный лишним кодом примерчик(вместе с dll) ?
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

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

Re: Align16, возможно ли?

Сообщение Mikle » 02.01.2010 (Сб) 13:45

Nord777 писал(а):А можно увидеть не сильно перегруженный лишним кодом примерчик(вместе с dll)

Конечно. Вот перемножение массива матриц (1000 шт.) на матрицу, результат - в другой массив:
http://tuapse-mikle.narod.ru/Matrix.zip
Исходник DLL тут же.
У .net немного выигрывает даже vb6, по крайней мера на атлонах.
CPP тут без выравнивания, и, соответственно, без SSE. Добавление SSE должно ускорить ещё в 1.5-2 раза, а на более сложных вычислениях - ещё больше.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Align16, возможно ли?

Сообщение MIT » 02.01.2010 (Сб) 14:42

Я что-то не понял, почему сравнивается
Код: Выделить всё
      For i As Integer = 1 To 100000
        For n As Integer = 0 To 997
          MatrixMultiply(M2(n), M1(n), M)
        Next n
      Next i
и
Код: Выделить всё
      For i As Integer = 1 To 100000
        CPPMatrixMultiply(M2(0), M1(0), M)
      Next i
:?:
Ведь во втором случае выполняется в тысячу раз меньше операций.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Align16, возможно ли?

Сообщение Nord777 » 02.01.2010 (Сб) 14:44

MIT писал(а):Ведь во втором случае выполняется в тысячу раз меньше операций.
Попался :D
В dll цикл от 1 до 1000
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Align16, возможно ли?

Сообщение MIT » 02.01.2010 (Сб) 14:48

Я не смотрел код библиотеки. Тогда ясно.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

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

Re: Align16, возможно ли?

Сообщение Mikle » 02.01.2010 (Сб) 16:14

MIT
997... а должно быть 999, очепятка :)
Это я ещё дал vb.net немного форы.
Вопрос про Align в силе.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Align16, возможно ли?

Сообщение Nord777 » 03.01.2010 (Вс) 1:34

Mikle
Немного поправил код.
VBNETMatrix.rar
(75.9 Кб) Скачиваний: 70

AMD Athlon 64 X2
Проект - принудительно х86
VB.Net - 4060 ms
C++ dll - 4580 ms

Включение SSE прибавки не дало.

Насчет выравнивания не понял. Тебе надо, чтобы начало каждой структуры в массиве было выравнено по 16-б. границе? Или каждое поле в структуре? И чем это может помочь?
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

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

Re: Align16, возможно ли?

Сообщение Mikle » 03.01.2010 (Вс) 11:21

Немного поправил код.

Скачал, дома посмотрю.
Включение SSE прибавки не дало.

Я, вообще-то, собирался на ассемблере с применением SSE-инструкций писать.
Тебе надо, чтобы начало каждой структуры в массиве было выравнено по 16-б. границе? Или каждое поле в структуре?

Каждой структуры, а так как размер структуры кратен 16-ти, то достаточно первого элемента массива.
И чем это может помочь?

Загрузка и сохранение одной инструкцией сразу четырёх элементов.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Align16, возможно ли?

Сообщение Nord777 » 03.01.2010 (Вс) 11:38

Я, вообще-то, собирался на ассемблере с применением SSE-инструкций писать.
А-а-а, понял :)
Ну для начала можно попробовать выделить неуправляемую память при помощи AllocHGlobal и скопировать данные по нужному адресу.
Если будет ощутимая прибавка от выравнивания, то можно будет и заморочться. Но пока ничего на ум не приходит(я про "чистые" методы).
Мозг после праздников брыкается :D
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

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

Re: Align16, возможно ли?

Сообщение Mikle » 04.01.2010 (Пн) 10:37

Nord777
У тебя две ошибки:
1.
Код: Выделить всё
         M1(n) = Mcls
         M2(n) = Mcls

Тут мы получаем два массива со ссылками на одни и те же объекты.
2.
У тебя умножается inM() на outM(), то есть, с учётом п.1, на себя же, результат идёт в M,
После исправления код уже немного отстаёт от C++, но всё равно быстрее структур.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Align16, возможно ли?

Сообщение FireFenix » 04.01.2010 (Пн) 11:25

И разве в .НЕТ не лучше использовать DllImport? :)
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

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

Re: Align16, возможно ли?

Сообщение Mikle » 04.01.2010 (Пн) 11:29

Чем лучше? Выглядит круче, или есть профит?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Align16, возможно ли?

Сообщение Viper » 04.01.2010 (Пн) 13:54

Mikle писал(а):Чем лучше? Выглядит круче, или есть профит?
Есть некоторый выигрыш в проиводительности. Где-то здесь это уже разбиралось в чем там разница.
Весь мир матрица, а мы в нем потоки байтов!

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Align16, возможно ли?

Сообщение Nord777 » 11.01.2010 (Пн) 10:57

Mikle, как успехи? Тестил уже с выравниванием и SSE ?
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

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

Re: Align16, возможно ли?

Сообщение Mikle » 12.01.2010 (Вт) 9:12

Nord777
Так оно же не работает, простой тест:
Код: Выделить всё
Imports System.Runtime.InteropServices

Public Class Form1
  <StructLayout(LayoutKind.Explicit, Pack:=16, Size:=64)> _
  Structure Matrix
    <FieldOffset(0)> Dim m11, m12, m13, m14 As Single
    <FieldOffset(16)> Dim m21, m22, m23, m24 As Single
    <FieldOffset(32)> Dim m31, m32, m33, m34 As Single
    <FieldOffset(48)> Dim m41, m42, m43, m44 As Single
  End Structure

  Private Declare Function VarPtr Lib "msvbvm60" (ByRef v As Single) As Integer

  Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
    Dim M1 As Matrix
    Dim M2(3) As Matrix

    If e.Button = Windows.Forms.MouseButtons.Left Then
      Text = VarPtr(M1.m11) Mod 16
    Else
      Text = VarPtr(M2(0).m11) Mod 16
    End If
  End Sub
End Class

Матрица M1 всегда выровнена, M2() нет. Что даёт это "Pack:=16" ?

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Align16, возможно ли?

Сообщение MIT » 12.01.2010 (Вт) 9:39

Может лучше не VarPtr, а какое-нибудь UnsafeAddrOfPinnedArrayElement?


Mikle писал(а):Что даёт это "Pack:=16" ?
MSDN писал(а):Controls the alignment of data fields of a class or structure in memory.


____
Наверное стоит перейти на использование неуправляемой памяти - и проблем с адресами не будет, и скорость возрасти может.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

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

Re: Align16, возможно ли?

Сообщение Mikle » 12.01.2010 (Вт) 14:21

Такая VarPtr:
Код: Выделить всё
  Private Function VarPtr(ByVal o As Object) As Integer
    Dim gc As System.Runtime.InteropServices.GCHandle = _
        System.Runtime.InteropServices.GCHandle.Alloc(o, _
        System.Runtime.InteropServices.GCHandleType.Pinned)
    Dim ptr As Integer = gc.AddrOfPinnedObject.ToInt32()
    Return ptr
  End Function

даёт то же самое. Да и мне нужно именно передавать Byref в неуправляемую процедуру, так что тут VarPtr из msvbvm.dll как раз подходит.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Align16, возможно ли?

Сообщение FireFenix » 12.01.2010 (Вт) 16:35

Код: Выделить всё
  <StructLayout(LayoutKind.Explicit, Pack:=16, Size:=64)> _
  Structure Matrix
    <FieldOffset(0)> Dim m11, m12, m13, m14 As Single
    <FieldOffset(16)> Dim m21, m22, m23, m24 As Single
    <FieldOffset(32)> Dim m31, m32, m33, m34 As Single
    <FieldOffset(48)> Dim m41, m42, m43, m44 As Single
  End Structure

Могу ошибаться... но по моему нада было бы указать для каждой переменной своё смещение...
Mikle писал(а):Такая VarPtr:
Код: Выделить всё
  Private Function VarPtr(ByVal o As Object) As Integer
    Dim gc As System.Runtime.InteropServices.GCHandle = _
        System.Runtime.InteropServices.GCHandle.Alloc(o, _
        System.Runtime.InteropServices.GCHandleType.Pinned)
    Dim ptr As Integer = gc.AddrOfPinnedObject.ToInt32()
    Return ptr
  End Function

даёт то же самое. Да и мне нужно именно передавать Byref в неуправляемую процедуру, так что тут VarPtr из msvbvm.dll как раз подходит.

Когда я прикручивал нативный ДХ, то достаточно было просто указать ByRef без выделения неуправляемой памяти...
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

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

Re: Align16, возможно ли?

Сообщение Mikle » 12.01.2010 (Вт) 16:43

Потому, что DX не требует Align16, а Align4 есть и так.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Align16, возможно ли?

Сообщение Nord777 » 12.01.2010 (Вт) 18:15

Mikle писал(а):Так оно же не работает, простой тест:
Всё правильно, Pack:=16 и не будет работать.

Есть одна задумка, как извратиться, но
Nord777 писал(а):Ну для начала можно попробовать выделить неуправляемую память при помощи AllocHGlobal и скопировать данные по нужному адресу.
т.е. попробуй скопировать массив структур по нужному(выравненному) адресу и посмотри величину прироста скорости.
Если прирост будет существенен - расскажу задумку и наверно поковыряюсь.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Align16, возможно ли?

Сообщение ANDLL » 21.01.2010 (Чт) 15:16

А зачем использовать структуры? Используй просто массив single'ов в котором "первым" назначай выравненный по нужной границе.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Re: Align16, возможно ли?

Сообщение Mikle » 21.01.2010 (Чт) 19:28

ANDLL
Я до этой фишки уже додумался, только делаю это на VB6.
А в NET придётся фиксировать массив в памяти, иначе не факт, что он останется на этом месте. Кроме того бывает удобно работать именно с матрицами или векторами, в VB6, опять же, это решается без проблем.
Сейчас я занят другой работой, но к этой обязательно вернусь.


Вернуться в Visual Basic .NET

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

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

    TopList  
cron