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

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

Но результат печальный


Standard
9,844955
75249998875,1828


Project1.dpr.40: x := x + x1;
0000000000426FF9 F20F100557370100 movsd xmm0,qword ptr [rel $00013757]
0000000000427001 F20F580557370100 addsd xmm0,qword ptr [rel $00013757]
0000000000427009 F20F110547370100 movsd qword ptr [rel $00013747],xmm0
Project1.dpr.41: x := x + x2;
0000000000427011 F20F10053F370100 movsd xmm0,qword ptr [rel $0001373f]
0000000000427019 F20F580547370100 addsd xmm0,qword ptr [rel $00013747]
0000000000427021 F20F11052F370100 movsd qword ptr [rel $0001372f],xmm0
Project1.dpr.42: x := x + x3;
0000000000427029 F20F100527370100 movsd xmm0,qword ptr [rel $00013727]
0000000000427031 F20F580537370100 addsd xmm0,qword ptr [rel $00013737]
0000000000427039 F20F110517370100 movsd qword ptr [rel $00013717],xmm0
Project1.dpr.43: x := x + x4;
0000000000427041 F20F10050F370100 movsd xmm0,qword ptr [rel $0001370f]
0000000000427049 F20F580527370100 addsd xmm0,qword ptr [rel $00013727]
0000000000427051 F20F1105FF360100 movsd qword ptr [rel $000136ff],xmm0
Project1.dpr.44: x := x + x5;
0000000000427059 F20F1005F7360100 movsd xmm0,qword ptr [rel $000136f7]
0000000000427061 F20F580517370100 addsd xmm0,qword ptr [rel $00013717]
0000000000427069 F20F1105E7360100 movsd qword ptr [rel $000136e7],xmm0
3 окт 17, 17:29    [20839755]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 2659
Няшик
Но результат печальный

{$EXCESSPRECISION OFF}
3 окт 17, 18:08    [20839942]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
Kazantsev Alexey
Няшик
Но результат печальный

{$EXCESSPRECISION OFF}


Ничего не поменялось
3 окт 17, 18:18    [20839974]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

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

По этому выигрыша нету никакого.
3 окт 17, 18:20    [20839982]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 2659
Няшик
Ничего не поменялось

И верно, оно же для сингла...
3 окт 17, 18:21    [20839987]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
Kazantsev Alexey
Няшик
Ничего не поменялось

И верно, оно же для сингла...


Ничего не поменялось. Вот что получилась (Так же переписывал SSE под Single)

+
program StrTest;

{$APPTYPE CONSOLE}
{$EXCESSPRECISION OFF}

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: Single;
  I: Integer;

begin
  x1 := 2.1;
  x2 := 3.1;
  x3 := 4.1;
  x4 := 5.1;
  x5 := 6.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');


  // Float (single)
  BeginTime;
  x := 10;
  asm
    movss xmm0, DWORD PTR [x]
  end;
  for I := 0 to 500000000 - 1 do
  begin
    asm
      addss xmm0, x1
      addss xmm0, x2
      addss xmm0, x3
      addss xmm0, x4
      addss xmm0, x5
    end;
  end;
  asm
    movss  DWORD PTR [x], xmm0
  end;
  EndTime;
  Writeln(FloatToStr(x));

  Readln;

end.
3 окт 17, 18:58    [20840066]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 2659
Няшик
Ничего не поменялось

Она для 64-битного режима.
3 окт 17, 19:08    [20840077]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
Kazantsev Alexey,

Ну так я и тестил для него. Просто выложил код SSE и для 32 битного режима

64 битный режим
Standard
9,316296


и 32 битный
Standard
9,496605
134217728

XMM
3,131645
134217728



-- Результаты не фееричные
3 окт 17, 19:23    [20840092]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
Кстати, для SSE double разумнее использовать для быстроты чем float. Не знаю почему, но float медленнее работает
3 окт 17, 19:25    [20840094]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Sapersky
Member

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

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

Самый разумный режим для SSE - это параллельный, а не скалярный, с обработкой нескольких чисел одной командой. Для того оно и придумывалось.
Компилятор Дельфи этого не умеет, сишные умеют, но требуют специальной доработки кода.
3 окт 17, 19:54    [20840110]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

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


64bit + галочка оптимизации
Project1.dpr.41: x := x + x1;
0000000000426FDB F30F100575370100 movss xmm0,dword ptr [rel $00013775]
0000000000426FE3 F30F580571370100 addss xmm0,dword ptr [rel $00013771]
0000000000426FEB F30F110565370100 movss dword ptr [rel $00013765],xmm0


Без галочки
Project1.dpr.41: x := x + x1;
0000000000426FDF F30F100571370100 movss xmm0,dword ptr [rel $00013771]
0000000000426FE7 F30F58056D370100 addss xmm0,dword ptr [rel $0001376d]
0000000000426FEF F30F110561370100 movss dword ptr [rel $00013761],xmm0


Галочка вообще не влияет.

И всё равно SSE даже уделывает без параллельной обработки стандартные средства
3 окт 17, 20:04    [20840122]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 2659
Няшик
64 битный режим
Standard
9,316296

А без директивы?
3 окт 17, 20:34    [20840172]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
Kazantsev Alexey,

Standard
15,558598
134217728
3 окт 17, 20:36    [20840175]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Sapersky
Member

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

Я же говорил - вынеси в отдельную функцию. Сейчас проверил - да, так гораздо лучше, почти без лишних обращений к памяти.
function AddStd(x1, x2, x3, x4, x5: Double): Double;
var x : Double;
    I: Integer;
begin
  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;
  Result := x;
end;
3 окт 17, 21:35    [20840252]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

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

Магия прям.. И что мешало ему так же оптимизировать код в общем begin-нее. И почему интересно нельзя включить SSE для 32 битного режима по умолчанию
3 окт 17, 22:02    [20840332]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Sapersky
Member

Откуда:
Сообщений: 17
Няшик
что мешало ему так же оптимизировать код в общем begin-не
Может быть, считают, что другой поток может читать из глобальной переменной, поэтому её нужно всё время писать в память, а не хранить в регистре.
Няшик
И почему интересно нельзя включить SSE для 32 битного режима по умолчанию
У владельцев Дельфи (которые в последнее время постоянно меняются) просто руки не доходят до вылизывания компилятора. SSE в x64 прикрутили вынужденно, потому что официально не рекомендуется использовать FPU в x64.
3 окт 17, 23:31    [20840520]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Няшик
Member

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

Всё понятно. Это печально конечно.
4 окт 17, 00:16    [20840588]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
bk0010
Member

Откуда:
Сообщений: 3675
Ничего не печально: на x64 в некоторых случаях точность расчетов ощутимо падает.
4 окт 17, 22:05    [20843783]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
Кар-Кар
Guest
bk0010
Ничего не печально: на x64 в некоторых случаях точность расчетов ощутимо падает.
При этом даже если попробовать асм-вставками, то воспользоваться fpu все равно не получится. Потому что окно регистров показывает какой-то несуразный мусор и глючит в режиме дебага 64-bit. Я ниче не понял =(
5 окт 17, 22:04    [20846625]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
alekcvp
Member

Откуда:
Сообщений: 507
Кар-Кар
bk0010
Ничего не печально: на x64 в некоторых случаях точность расчетов ощутимо падает.
При этом даже если попробовать асм-вставками, то воспользоваться fpu все равно не получится. Потому что окно регистров показывает какой-то несуразный мусор и глючит в режиме дебага 64-bit. Я ниче не понял =(

Может там MMX-регистры используются? Они же вроде общие с FPU.
5 окт 17, 22:29    [20846703]     Ответить | Цитировать Сообщить модератору
 Re: goto address  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 2400
bk0010
Ничего не печально: на x64 в некоторых случаях точность расчетов ощутимо падает.

это баги в винде (обычно в драйверах или кодеках), нужно просто следить за точностью вычислений fpu
6 окт 17, 12:27    [20847803]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 16 17 18 19 20 21 22 23 24 [25]
Все форумы / Delphi Ответить