powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / goto address
21 сообщений из 621, страница 25 из 25
goto address
    #39530371
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я конечно знал, что 64 битный режим компилирует SSE инструкции.

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


Standard
9,844955
75249998875,1828


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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
...
Рейтинг: 0 / 0
goto address
    #39530438
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикНо результат печальный
{$EXCESSPRECISION OFF}
...
Рейтинг: 0 / 0
goto address
    #39530442
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyНяшикНо результат печальный
{$EXCESSPRECISION OFF}

Ничего не поменялось
...
Рейтинг: 0 / 0
goto address
    #39530445
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ирония в том, что он заносит текущее состояние переменной в регистр XMM и потом увеличивает его. И кладёт полученный результат от куда взял начальный.

По этому выигрыша нету никакого.
...
Рейтинг: 0 / 0
goto address
    #39530447
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикНичего не поменялось
И верно, оно же для сингла...
...
Рейтинг: 0 / 0
goto address
    #39530462
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyНяшикНичего не поменялось
И верно, оно же для сингла...

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
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.

...
Рейтинг: 0 / 0
goto address
    #39530465
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикНичего не поменялось
Она для 64-битного режима.
...
Рейтинг: 0 / 0
goto address
    #39530467
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

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

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


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

XMM
3,131645
134217728



-- Результаты не фееричные
...
Рейтинг: 0 / 0
goto address
    #39530468
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, для SSE double разумнее использовать для быстроты чем float. Не знаю почему, но float медленнее работает
...
Рейтинг: 0 / 0
goto address
    #39530475
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няшик,

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

Самый разумный режим для SSE - это параллельный, а не скалярный, с обработкой нескольких чисел одной командой. Для того оно и придумывалось.
Компилятор Дельфи этого не умеет, сишные умеют, но требуют специальной доработки кода.
...
Рейтинг: 0 / 0
goto address
    #39530477
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sapersky,


64bit + галочка оптимизации
Код: pascal
1.
2.
3.
4.
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



Без галочки
Код: pascal
1.
2.
3.
4.
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 даже уделывает без параллельной обработки стандартные средства
...
Рейтинг: 0 / 0
goto address
    #39530485
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик64 битный режим
Standard
9,316296
А без директивы?
...
Рейтинг: 0 / 0
goto address
    #39530486
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Standard
15,558598
134217728
...
Рейтинг: 0 / 0
goto address
    #39530502
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няшик,

Я же говорил - вынеси в отдельную функцию. Сейчас проверил - да, так гораздо лучше, почти без лишних обращений к памяти.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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;
...
Рейтинг: 0 / 0
goto address
    #39530510
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sapersky,

Магия прям.. И что мешало ему так же оптимизировать код в общем begin-нее. И почему интересно нельзя включить SSE для 32 битного режима по умолчанию
...
Рейтинг: 0 / 0
goto address
    #39530528
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няшикчто мешало ему так же оптимизировать код в общем begin-неМожет быть, считают, что другой поток может читать из глобальной переменной, поэтому её нужно всё время писать в память, а не хранить в регистре.
НяшикИ почему интересно нельзя включить SSE для 32 битного режима по умолчаниюУ владельцев Дельфи (которые в последнее время постоянно меняются) просто руки не доходят до вылизывания компилятора. SSE в x64 прикрутили вынужденно, потому что официально не рекомендуется использовать FPU в x64.
...
Рейтинг: 0 / 0
goto address
    #39530535
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sapersky,

Всё понятно. Это печально конечно.
...
Рейтинг: 0 / 0
goto address
    #39531147
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего не печально: на x64 в некоторых случаях точность расчетов ощутимо падает.
...
Рейтинг: 0 / 0
goto address
    #39531841
Кар-Кар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bk0010Ничего не печально: на x64 в некоторых случаях точность расчетов ощутимо падает.При этом даже если попробовать асм-вставками, то воспользоваться fpu все равно не получится. Потому что окно регистров показывает какой-то несуразный мусор и глючит в режиме дебага 64-bit. Я ниче не понял =(
...
Рейтинг: 0 / 0
goto address
    #39531852
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кар-Карbk0010Ничего не печально: на x64 в некоторых случаях точность расчетов ощутимо падает.При этом даже если попробовать асм-вставками, то воспользоваться fpu все равно не получится. Потому что окно регистров показывает какой-то несуразный мусор и глючит в режиме дебага 64-bit. Я ниче не понял =(
Может там MMX-регистры используются? Они же вроде общие с FPU.
...
Рейтинг: 0 / 0
goto address
    #39532095
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bk0010Ничего не печально: на x64 в некоторых случаях точность расчетов ощутимо падает.
это баги в винде (обычно в драйверах или кодеках), нужно просто следить за точностью вычислений fpu
...
Рейтинг: 0 / 0
21 сообщений из 621, страница 25 из 25
Форумы / Delphi [игнор отключен] [закрыт для гостей] / goto address
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]