Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 16 17 18 19 20 21 22 23 [24] 25   вперед  Ctrl
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
Кстати, если будут вопросы почему написано
7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383

Вот ссылки
https://oeis.org/wiki/Mersenne_numbers
https://oeis.org/A000225
25 сен 17, 23:46    [20822197]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
defecator
Member

Откуда:
Сообщений: 35371
Программирование ради программирования
26 сен 17, 08:54    [20822446]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
alekcvp
Member

Откуда:
Сообщений: 507
Няшик,

Ты серьёзно сравниваешь скорость процедуры для сравнения строк с проверками и процедуры для сравнения памяти, с отдельно переданной длиной и без проверок?.. Ну тогда ещё с FillChar(A, Len, 0); по скорости сравни :)
26 сен 17, 10:20    [20822721]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
alekcvp
Member

Откуда:
Сообщений: 507
Няшик
Кстати, если будут вопросы почему написано
7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383

А я думал это тупо сдвиг влево с заполнением 1цей
26 сен 17, 10:22    [20822730]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
alekcvp
Няшик,

Ты серьёзно сравниваешь скорость процедуры для сравнения строк с проверками и процедуры для сравнения памяти, с отдельно переданной длиной и без проверок?.. Ну тогда ещё с FillChar(A, Len, 0); по скорости сравни :)


Это для MemCmp, она действительно не проверяет сей чудо, потому что у меня функция не работает когда данные памяти пустые.

И да, зачем в MemCmp проверка длины ??....


А вот для cmp та же история. Только я для форума добавил туды
  mov ecx, DWORD PTR [eax-4]  // LenStr <> LenStr2 to false
  cmp DWORD PTR [edx-4], ecx


А так же есть проверка, что бы переменные не были nil, и если они ровны == то сразу true.

Кстати, я этот код написал балуясь на http://godbolt.org/ изучая все возможные реализации на быстроту.

+
Картинка с другого сайта.
26 сен 17, 11:10    [20823000]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
Написал структуры __m128i и __m128d для Delphi

Может кому пригодятся

+
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils, windows;

type
  PM128i = ^TM128i;
  PM128d = ^TM128d;

  TM128i = record
    case longint of
      0: (m128i_i8: array [0 .. 15] of shortint);
      1: (m128i_i16: array [0 .. 7] of smallint);
      2: (m128i_i32: array [0 .. 3] of Integer);
      3: (m128i_i64: array [0 .. 1] of int64);
      4: (m128i_u8: array [0 .. 15] of byte);
      5: (m128i_u16: array [0 .. 7] of word);
      6: (m128i_u32: array [0 .. 3] of Cardinal);
      7: (m128i_u64: array [0 .. 1] of UInt64);
  end align 16;

  TM128d = record
    m128d_f64: array [0 .. 1] of double;
  end align 16;

procedure SetIntSSE2(var v: TM128i; a: Integer);
asm
  movd xmm0, edx
  pshufd xmm0, xmm0, 0
  movdqa dqword ptr [eax], xmm0
end;

procedure GetIntSSE2(var v: Integer; b: TM128i);
asm
  movss dword ptr [eax], xmm0
end;

procedure Plus(a, b: TM128i);
asm
  paddd xmm0, dqword ptr [eax]
  movdqa dqword ptr [eax], xmm0
end;

var
  xmm1, xmm2: TM128i;
  Result: Integer;

begin
  SetIntSSE2(xmm1, 245);
  SetIntSSE2(xmm2, 324);
  Plus(xmm1, xmm2);
  GetIntSSE2(Result, xmm1);
  Writeln(Result); // 569
  Readln;
end.
27 сен 17, 11:28    [20826203]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2084
Спасибо, может быть полезно.

SetIntSSE2(xmm1, 245);
  SetIntSSE2(xmm2, 324);
  Plus(xmm1, xmm2);
  GetIntSSE2(Result, xmm1);


оформи как перегрузку операторов.
27 сен 17, 18:13    [20827519]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
makhaon
Спасибо, может быть полезно.

SetIntSSE2(xmm1, 245);
  SetIntSSE2(xmm2, 324);
  Plus(xmm1, xmm2);
  GetIntSSE2(Result, xmm1);


оформи как перегрузку операторов.


Вполне логично для проекта, но не для примера. Я честно не понимаю -почему не работает регистр возврата. Код падает, возможно надо было сделать [Align(16)] но как - то запарно стало для примера.

Я использую чистый asm для функций. И переменные беру из структуры(ООП реализованный). По этому у меня прямой стэк со значением Value, и ничего не падало.
28 сен 17, 15:28    [20829286]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
alekcvp
Member

Откуда:
Сообщений: 507
Няшик
Код падает, возможно надо было сделать [Align(16)] но как - то запарно стало для примера.

movdqa - MOVe Double Quadword Aligned
29 сен 17, 19:51    [20832511]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
alekcvp
Няшик
Код падает, возможно надо было сделать [Align(16)] но как - то запарно стало для примера.

movdqa - MOVe Double Quadword Aligned



На c++ не падает. Проверял в VS
29 сен 17, 20:20    [20832528]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
Сейчас решил разобраться почему падало. Оказалась надо было просто тупо использовать Result для возврата. И не выпендриваться с регистрами возраста.

+
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils, windows;

type
  PM128i = ^TM128i;
  PM128d = ^TM128d;

  TM128i = record
    case longint of
      0: (m128i_i8: array [0 .. 15] of shortint);
      1: (m128i_i16: array [0 .. 7] of smallint);
      2: (m128i_i32: array [0 .. 3] of Integer);
      3: (m128i_i64: array [0 .. 1] of int64);
      4: (m128i_u8: array [0 .. 15] of byte);
      5: (m128i_u16: array [0 .. 7] of word);
      6: (m128i_u32: array [0 .. 3] of Cardinal);
      7: (m128i_u64: array [0 .. 1] of UInt64);
  end align 16;

  TM128d = record
    m128d_f64: array [0 .. 1] of double;
  end align 16;

function SetIntSSE2(a: Integer):TM128i;
asm
  movd xmm0, eax
  pshufd xmm0, xmm0, 0
  movdqa dqword ptr [Result], xmm0
end;

function GetIntSSE2(b: TM128i):Integer;
asm
  movss Result, xmm0
end;

function Plus(a, b: TM128i):TM128i;
asm
  paddd xmm0, dqword ptr [eax]
  movdqa dqword ptr [Result], xmm0
end;

function TestPlus(A, B: Double): Double; // TM128d  
asm
  movsd xmm0, A
  addsd xmm0, B
  movsd Result, xmm0
end;

var
  xmm1, xmm2, xmm3: TM128i;
  Result: Integer;

begin
  xmm1 := SetIntSSE2(245);
  xmm2 := SetIntSSE2(324);
  xmm3 := Plus(xmm1, xmm2);
  Result := GetIntSSE2(xmm1);
  Writeln(Result); // 569
  Readln;
end.
2 окт 17, 21:31    [20837444]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
Тест на сколько SSE быстрее складывает числа

+
Картинка с другого сайта.


0,3 секунды через SSE

и 0,9 секунды через стандартные средства
2 окт 17, 21:33    [20837449]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
Оптимизация была включена. По этому смысла в inc не было.
2 окт 17, 21:50    [20837495]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
чччД
Guest
Лошарик. :)
2 окт 17, 22:26    [20837563]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2084
Тест некорректный, но направление верное :)

автор
function TestPlus(A, B: Double): Double; // TM128d
asm
movsd xmm0, A
addsd xmm0, B
movsd Result, xmm0
end;


Просится на перегрузку плюса :) Только 'в лоб' не сделать.
2 окт 17, 23:16    [20837646]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
alekcvp
Member

Откуда:
Сообщений: 507
makhaon
Просится на перегрузку плюса :) Только 'в лоб' не сделать.

Самое обидное что в inline процедурах нельзя в asm-блоки. В принципе, понятно почему, но обидно.
3 окт 17, 10:01    [20838082]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2084
Для информации:
https://stackoverflow.com/questions/33585327/what-is-noframe-in-delphi-64-bit-assembly
по ссылкам тоже кое-что там есть.
3 окт 17, 13:29    [20838825]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
чччД
Лошарик. :)


За то не пенёк, и уже хорошо ! А до пня мне ещё минимум лет 40

makhaon
Тест некорректный, но направление верное :)

автор
function TestPlus(A, B: Double): Double; // TM128d
asm
movsd xmm0, A
addsd xmm0, B
movsd Result, xmm0
end;


Просится на перегрузку плюса :) Только 'в лоб' не сделать.


Это очень жалко.. Вообще. Тут попахивает полностью переписываением компилятора, что бы клал цифры только в xmm, и мог работать без конвертации в double операции без нужды. Только для вывода.
3 окт 17, 14:01    [20838968]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
makhaon
Тест некорректный, но направление верное :)


Кстати, в чём некорректность? Всё работает одинаково, если про double plus
3 окт 17, 14:06    [20838995]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2084
Няшик,

автор
Кстати, в чём некорректность?


есть подозрение, что работа что в делфи идёт работа с памятью, что, понятно, скорости не добавляет. с другой стороны - если скорость увеличивается - то и ладно.

автор
что бы клал цифры только в xmm, и мог работать без конвертации в double операции без нужды


1. посмотри ссылки.
2. а нужно ли вообще результат возвращать? может быть сделать дополнительные процедуры - и пусть в xmm и лежало бы. а уж из функции вернуть результат.
3 окт 17, 15:21    [20839276]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2084
читать:

есть подозрение, что в делфи идёт работа с памятью, что, понятно, скорости не добавляет. с другой стороны - если скорость увеличивается - то и ладно.

сорри, спешка :) и отсутствие редактора.
3 окт 17, 15:22    [20839280]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
Ну фиг его знает, а скорость с использование XMM высокая.

Вот проект. (Пришлось заново писать, сегодня утром затёр тестовый проект)

Standard
9,226910
75249998875,1828

XMM
3,076441
75249998875,1828


+
program StrTest;

{$APPTYPE CONSOLE}

uses
  windows, SysUtils;

var
  StartTime, StopTime: Int64;
  iCounterPerSec: Int64;

procedure BeginTime;
begin
  QueryPerformanceCounter(StartTime);
end;

procedure EndTime;
begin
  if QueryPerformanceCounter(StopTime) and QueryPerformanceFrequency(iCounterPerSec) then
    Writeln(Format('%.6f', [(StopTime - StartTime) / iCounterPerSec]));
end;

var
  x, x1, x2, x3, x4, x5: Double;
  I: Integer;

begin
  x1 := 10.1;
  x2 := 20.1;
  x3 := 30.1;
  x4 := 40.1;
  x5 := 50.1;

  Writeln('Standard');

  BeginTime;
  x := 10;
  for I := 0 to 500000000 - 1 do
  begin
    x := x + x1;
    x := x + x2;
    x := x + x3;
    x := x + x4;
    x := x + x5;
  end;
  EndTime;
  Writeln(FloatToStr(x));

  Writeln('XMM');

  BeginTime;
  x := 10;
  asm
    movq xmm0, QWORD PTR [x]
  end;
  for I := 0 to 500000000 - 1 do
  begin
    asm
      addsd xmm0, x1
      addsd xmm0, x2
      addsd xmm0, x3
      addsd xmm0, x4
      addsd xmm0, x5
    end;
  end;
  asm
    movsd qword ptr [x], xmm0
  end;
  EndTime;
  Writeln(FloatToStr(x));

  Readln;

end.
3 окт 17, 16:05    [20839418]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
Сейчас в голову пришло. Можно сделать пред компиляцию. Т.е, добавить свой синтаксис, который будет компилироваться в ассемблерные ставки в сам код. И потом этот код можно будет компилировать в среде

Только надо будет поработать над конвертацией типов.(И придумать как завязать пред компиляцию в самой среде) И дело в шляпе
3 окт 17, 16:29    [20839503]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Sapersky
Member

Откуда:
Сообщений: 17
Няшик,

Не мучайся, переключи уже компилятор в 64-битный режим. Как раз в эти movsd/addsd и будет компилироваться.
3 окт 17, 16:53    [20839612]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
Sapersky
Няшик,

Не мучайся, переключи уже компилятор в 64-битный режим. Как раз в эти movsd/addsd и будет компилироваться.



Никто не говорил что я мучался. Речь шла о псевда define из c++

Эти команды и в 32 битном режиме прекрасно работают.

Над строковыми представлениями можно вообще сделать свой контейнер, богатый - сразу с выравниванием, и.т.д. Что лучше будет в несколько раз. Даже не надо будет скипывать в 32 битном режиме 4 байта.
3 окт 17, 17:21    [20839718]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 16 17 18 19 20 21 22 23 [24] 25   вперед  Ctrl
Все форумы / Delphi Ответить