Перемножаю в DLL на C++
Nord777 писал(а):А можно увидеть не сильно перегруженный лишним кодом примерчик(вместе с dll)
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
ПопалсяMIT писал(а):Ведь во втором случае выполняется в тысячу раз меньше операций.
Немного поправил код.
Включение SSE прибавки не дало.
Тебе надо, чтобы начало каждой структуры в массиве было выравнено по 16-б. границе? Или каждое поле в структуре?
И чем это может помочь?
А-а-а, понялЯ, вообще-то, собирался на ассемблере с применением SSE-инструкций писать.
M1(n) = Mcls
M2(n) = Mcls
Есть некоторый выигрыш в проиводительности. Где-то здесь это уже разбиралось в чем там разница.Mikle писал(а):Чем лучше? Выглядит круче, или есть профит?
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
Mikle писал(а):Что даёт это "Pack:=16" ?
MSDN писал(а):Controls the alignment of data fields of a class or structure in memory.
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
<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 как раз подходит.
Всё правильно, Pack:=16 и не будет работать.Mikle писал(а):Так оно же не работает, простой тест:
т.е. попробуй скопировать массив структур по нужному(выравненному) адресу и посмотри величину прироста скорости.Nord777 писал(а):Ну для начала можно попробовать выделить неуправляемую память при помощи AllocHGlobal и скопировать данные по нужному адресу.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10