Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
 Re: Итоги 2017 года  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3119
Siemargl
нет смысла сравниваться с моно - это опенсорсный выпердок изначально и труп в ближайшей перспективе

На счёт перспективы видимо да, но с чем ещё сравнивать корку под линуксом, как не с моной.

makhaon,

Для шарпа там есть многопоточный вариант.
3 янв 18, 22:13    [21080760]     Ответить | Цитировать Сообщить модератору
 Re: Итоги 2017 года  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 5970
Siemargl
AFAIK,

fpc - самый говеный компилятор из всех существующих в мире за последние надцать лет

кто хочет - может оспорить с тестами и примерами кодогенерации

В общем, взялся немного за документацию и тесты - не все так печально, как я себе представлял. Ну то есть печально, но оптимизатор там есть )

TLDR - насильно включайте SSE2 для 32бит, а лучше сразу использовать 64-битную компиляцию
+
Он все еще худший среди оптимизирующих - но в версии 3.04 для 32-бит включение правильной оптимизации ускоряет на рэйтресинге в 1.6 раз, в основном за счет SSE.

Что нужно не забывать, кроме О4, - насильно прописывать ему тип процессора и для 32-бит - SSE2 для плавающей точки, он автоматически это не делает.

К сожалению, 32-битный компилятор, похоже забросили, и с AVX он уже не компилирует.
А тот же тест в 64-битном режиме в 1.5 быстрее, чем в 32-бит (

Впрочем - отличие по режимам процессора по ассемблерному кому минимальное - основная причина в разнице скорости - 64-бит по дефолту использует AVX, а 32-бит - x87.


В целом, кто хочет - может дописать один из тестов, которого не хватает для Паскаля, ну или попытаться оптимизировать провальные
http://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=fpascal&lang2=gpp
6 янв 18, 09:56    [21084302]     Ответить | Цитировать Сообщить модератору
 Re: Итоги 2017 года  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3594
Siemargl,

какой смысл?
любой тест специализирующийся на какой-то узкой области предвзятый.
6 янв 18, 10:51    [21084341]     Ответить | Цитировать Сообщить модератору
 Re: Итоги 2017 года  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3119
Интереса ради запустил шарповый код под .NET Core на линуксе. Оказалось, он быстрее дельфийского на 26%. Причём дельфийский код (10.1, Win64) работал на хост-машине, а шарповый на виртуалке.
23 янв 18, 13:11    [21130269]     Ответить | Цитировать Сообщить модератору
 Re: Итоги 2017 года  [new]
чччД
Guest
Kazantsev Alexey
Интереса ради запустил шарповый код под .NET Core на линуксе. Оказалось, он быстрее дельфийского на 26%. ...

А что ты измерял?
23 янв 18, 13:13    [21130277]     Ответить | Цитировать Сообщить модератору
 Re: Итоги 2017 года  [new]
НуИПоХуй
Guest
Все пропало.... Клиент уезжает... Гипс снимают!!!
23 янв 18, 13:13    [21130279]     Ответить | Цитировать Сообщить модератору
 Re: Итоги 2017 года  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3119
чччД
А что ты измерял?

https://github.com/Mark-Kovalyov/CardRaytracerBenchmark
23 янв 18, 13:34    [21130400]     Ответить | Цитировать Сообщить модератору
 Re: Итоги 2017 года  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 1946
Kazantsev Alexey
Интереса ради запустил шарповый код под .NET Core на линуксе. Оказалось, он быстрее дельфийского на 26%. Причём дельфийский код (10.1, Win64) работал на хост-машине, а шарповый на виртуалке.
Ты фрипаскалевский код компилил? Он там нормально написан?
23 янв 18, 14:28    [21130748]     Ответить | Цитировать Сообщить модератору
 Re: Итоги 2017 года  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3119
white_nigger
Ты фрипаскалевский код компилил? Он там нормально написан?

Да. Да. :)
23 янв 18, 14:42    [21130849]     Ответить | Цитировать Сообщить модератору
 Re: Итоги 2017 года  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3594
white_nigger,

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

надо бы его как нить пооптимизировать и уравнять алгоритмы, что бы они одно и тоже делали, а не каждый сам по себе
не помню что бы кардинально было отличие от плюсов больше 60% когда я его тестил
ява с шарпом там тупили одинаково
23 янв 18, 14:53    [21130933]     Ответить | Цитировать Сообщить модератору
 Re: Итоги 2017 года  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3119
kealon(Ruslan)
на виртуалке может быстрее отрабатывать за счёт приоритетов, а на винде тупить за счёт приостановки задачи

Ещё ни разу код выполняющийся на виртуалке не работал быстрее чем код на хостовой машине (я в основном работаю и тестирую на виртуалках, потому знаю о чём говорю), за исключением кода активно работающего с диском. Для интереса могу и дельфёвый в виртуалку засунуть, если ты думаешь, что это поможет :)
23 янв 18, 15:00    [21130983]     Ответить | Цитировать Сообщить модератору
 Re: Итоги 2017 года  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3594
Kazantsev Alexey,

а ты не знал что Linux поровнее проц выдаёт чем винда?

вот тест с моей машинки 1-е MSVC++, второй fpc:
G:\Temp>test.cmd
15:36:20,89

G:\Temp>card_raytracer_cpp.exe d1.ppm
15:36:32,96

G:\Temp>card_raytracer.exe 1>d2.ppm
15:36:54,43

плюсовый код поменялся судя по отличию в выводе, что-то оптимизировали, первоначальный исходник не нашёл
23 янв 18, 15:44    [21131298]     Ответить | Цитировать Сообщить модератору
 Re: Итоги 2017 года  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3594
Kazantsev Alexey,

эти тесты тупо причёсывать надо, иначе они производительность генераторов случайных чисел накладывают
и сравнивать результаты на полное совпадение
23 янв 18, 15:46    [21131307]     Ответить | Цитировать Сообщить модератору
 Re: Итоги 2017 года  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3119
kealon(Ruslan)
а ты не знал что Linux поровнее проц выдаёт чем винда?

Винда в тестировании вообще не использовалась. Дельфийский код запускался на вайне, который, как известно, не эмулятор, а альтернативная реализация WinAPI, которого этот код не использует.

kealon(Ruslan)
эти тесты тупо причёсывать надо, иначе они производительность генераторов случайных чисел накладывают
и сравнивать результаты на полное совпадение

В паскалевской реализации бенча используется довольно примитивный гсч. Я его перенёс в шарповый бенч, дабы идентичность обеспечить, в результате шарповый стал работать ещё быстрее.
23 янв 18, 17:06    [21131683]     Ответить | Цитировать Сообщить модератору
 Re: Итоги 2017 года  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3594
Kazantsev Alexey,

хз, генератор я естественно меняю и ставлю одинаковый

но я почему-то не вижу этих 260% не на G++ не на MSVC, может я криво тестю? или у меня компилятор какой-то тюнингованный (вполне старый fpc 3.0.0 под виндой и под Linux с репа Mint)?
под виндой оба 64-битные release. под Linux такая же лабуда была в сравнение с G++

причём заметь, код на fpc специально не тюнингован, а один в один до порядка действий переписан с С++

под Wine я бы не сравнивал как что работает при любых допущениях, я написал только к выссказыванию 21130748 из которого и следует что под виндой запускается и сравнивается с результатом в ВМ
23 янв 18, 17:49    [21131876]     Ответить | Цитировать Сообщить модератору
 Re: Итоги 2017 года  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3119
kealon(Ruslan)
но я почему-то не вижу этих 260%

260% и я не вижу.

kealon(Ruslan)
под Wine я бы не сравнивал как что работает при любых допущениях

Почему бы и нет? Там исполняется ровно тот же самый x86_64, системных вызовов в бенче нет т.ч. влияния вайна быть не может.

С фпц ещё прикол. Один и тот же код, собранный с идентичными настройками, но под разные платформы (Win_x64, Linux_x64) показывает разный результат и результат виндового варианта значительно лучше. Линуксовый запускался в родной среде, виндовый в ней же но под вайном. Правда компилятор у меня транковый.
23 янв 18, 18:10    [21131936]     Ответить | Цитировать Сообщить модератору
 Re: Итоги 2017 года  [new]
Sapersky
Member

Откуда:
Сообщений: 33
Kazantsev Alexey
260% и я не вижу.

В той ветке тестеры собирали на Си с -march=native, т.е. все инструкции вплоть до AVX2/FMA, а на fpc видимо остался по умолчанию SSE2.
Но даже если включить все инструкции в FPC, он выдаёт довольно корявый по сравнению с Си код.
https://godbolt.org/g/eoqaRv
https://godbolt.org/g/xXT9P3
Использование всего 2-3 регистров, постоянные обращения к памяти, в общей сумме в 2 раза длиннее.
Похоже, проблема в кривом инлайне - каждая "вызываемая" процедурка берёт параметры из памяти и в конце пишет результат в память. Кому не лень, можете заинлайнить вручную и проверить.
23 янв 18, 21:03    [21132202]     Ответить | Цитировать Сообщить модератору
 Re: Итоги 2017 года  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 5970
Дело не в инлайне. Инлайн в целом удлиняет программу.

Здесь же асм код от паскаля втрое! длиннее.
23 янв 18, 21:25    [21132234]     Ответить | Цитировать Сообщить модератору
 Re: Итоги 2017 года  [new]
rgreat
Member

Откуда:
Сообщений: 4582
Посмотрел я на этот бенч.

Сдаеться мне они там меряют скорость вывода в консоль/файл а не только качество алгоритмов и компилятора. ;)
23 янв 18, 21:43    [21132258]     Ответить | Цитировать Сообщить модератору
 Re: Итоги 2017 года  [new]
rgreat
Member

Откуда:
Сообщений: 4582
Адаптировал FPC под дельфовый код. Выложите скомпиленный эталон на FPC и еще на чем нибуть.
23 янв 18, 21:47    [21132265]     Ответить | Цитировать Сообщить модератору
 Re: Итоги 2017 года  [new]
rgreat
Member

Откуда:
Сообщений: 4582
Ну или сами тестите.

+
program card_raytracer;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,Math;

const
  Width = 512;
  Height = 512;

  M = 1048576; // 2^20
  J = 2045;
var
  oldI: integer = 12357;
type
  TFloat = double;

  TVector = record
     class operator Add(const v1,v2: TVector): TVector;
     class operator Subtract(const v1,v2: TVector): TVector;
     class operator Multiply(const v1,v2: TVector): TFloat; overload;
     class operator Multiply(const v: TVector; r: TFloat): TVector; overload;

    case integer of
      0: (x, y, z: TFloat;);
      1: (vector: array[1..3] of TFloat;);
  end;

  function Vector(a, b, c: TFloat): TVector; inline;
  begin
    Result.x := a;
    Result.y := b;
    Result.z := c;
  end;

  function rand0_1(): TFloat; inline;
  begin
    oldI := (oldI * J + 1) mod M;
    Result := oldI / M;
  end;

  function exp(const v1, v2: TVector): TVector;
  begin
    Result := Vector(v1.y * v2.z - v1.z * v2.y, v1.z * v2.x -
      v1.x * v2.z, v1.x * v2.y - v1.y * v2.x);
  end;

  function norm(const v: TVector): TVector;
  var
    r: TFloat;
  begin
    r := sqrt(v * v);
    Result := v * (1 / r);
  end;

const
  Gt: array[0..8] of integer = (
    $0003C712,  // 00111100011100010010
    $00044814,  // 01000100100000010100
    $00044818,  // 01000100100000011000
    $0003CF94,  // 00111100111110010100
    $00004892,  // 00000100100010010010
    $00004891,  // 00000100100010010001
    $00038710,  // 00111000011100010000
    $00000010,  // 00000000000000010000
    $00000010  // 00000000000000010000
    );

  function tracer(const o, d: TVector; out t: Tfloat; out n: TVector): integer;
  var
    k, j: integer;
    pp: TFloat;
    p: TVector;
    b: TFloat;
    c, q, s: TFloat;
  begin
    t := 1e9;
    Result := 0;
    pp := -o.z / d.z;
    if (0.01 < pp) then
    begin
      t := pp;
      n := Vector(0, 0, 1);
      Result := 1;
    end;
    for k := 18 downto 0 do
    begin
      for j := 8 downto 0 do
      begin
        if (Gt[j] and (1 shl k)) = 0 then
          continue;
        p := o + Vector(-k, 0, -(j + 4));
        b := p * d;
        c := p * p - 1;
        q := b * b - c;
        if (q <= 0) then
          continue;
        s := -b - sqrt(q);
        if (s < t) and (s > 0.01) then
        begin
          t := s;
          n := norm(p + d * t);
          Result := 2;
        end;
      end;
    end;
  end;

  function sampler(const o, d: TVector): TVector;
  var
    t: TFloat;
    n: TVector;
    m: integer;
    h, l, r, s: TVector;
    b, p: TFloat;
    p1, p2: TFloat;
  begin

    m := tracer(o, d, t, n);
    if (m = 0) then
      exit(Vector(0.7, 0.6, 1) * power(1 - d.z, 4));

    h := o + d * t;
    p2 := 9 + rand0_1();
    p1 := 9 + rand0_1();
    l := norm(Vector(p1, p2, 16) - h);
    r := d + n * (n * d * (-2));
    b := l * n;
    if (b < 0) or (tracer(h, l, t, n) <> 0) then
      b := 0;

    p := power(l * r, 99) * Ord(b > 0);
    if (m and 1) <> 0 then
    begin
      h := h * 0.2;
      if ((ceil(h.x) + ceil(h.y)) and 1) <> 0 then
      begin
        s := Vector(3, 1, 1);
      end
      else
      begin
        s := Vector(3, 3, 3);
      end;
      exit(s * (b * 0.2 + 0.1));
    end
    else
    begin
      Result := Vector(p, p, p) + sampler(h, r) * 0.5;
    end;
  end;

var
  g, a, b, c, p, t, ta, tb: TVector;
  y, x, r: integer;


{ TVector }

class operator TVector.Add(const v1, v2: TVector): TVector;
begin
  Result.x:=v1.x + v2.x;
  Result.y:=v1.y + v2.y;
  Result.z:=v1.z + v2.z;
end;

class operator TVector.Multiply(const v1, v2: TVector): TFloat;
begin
  Result := v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
end;

class operator TVector.Multiply(const v: TVector; r: TFloat): TVector;
begin
  Result.x:=v.x * r;
  Result.y:=v.y * r;
  Result.z:=v.z * r;
end;

class operator TVector.Subtract(const v1, v2: TVector): TVector;
begin
  Result.x:=v1.x - v2.x;
  Result.y:=v1.y - v2.y;
  Result.z:=v1.z - v2.z;
end;

begin
  writeln('P6');
  //writeln('P3');
  writeln(Width, ' ', Height);
  Write('255 ');
  g := norm(Vector(-6, -16, 0));
  a := norm((exp(Vector(0, 0, 1),g))) * 0.002;
  b := norm(exp(g,a)) * 0.002;
  c := (a + b) * (-256) + g;
  for y := Height - 1 downto 0 do
  begin
    ;
    for x := Width - 1 downto 0 do
    begin
      p := Vector(13, 13, 13);
      for r := 64 downto 1 do
      begin
        tb := b * ((rand0_1() - 0.5) * 99);
        ta := a * ((rand0_1() - 0.5) * 99);
        t := ta + tb;
        p := sampler(Vector(17, 16, 8) + t,
          norm(t * (-1) + (a * (rand0_1() + x) + b * (y + rand0_1()) + c) * 16)) *
          3.5 + p;
      end;
      //writeln(min(round(p.x),255),' ',min(round(p.y),255),' ',min(round(p.z),255));
      Write(char(round(p.x)), char(round(p.y)), char(round(p.z)));
    end;
  end;
end.
23 янв 18, 21:56    [21132279]     Ответить | Цитировать Сообщить модератору
 Re: Итоги 2017 года  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3119
rgreat
Сдаеться мне они там меряют скорость вывода в консоль/файл а не только качество алгоритмов и компилятора. ;)

Там того вывода... Впрчем, я для фпц и дельфей вообще вывод отключал, у шарпа оставил.

rgreat
Выложите скомпиленный эталон на FPC и еще на чем нибуть.

Могу сборку для .net core выложить если у тебя есть на чём запустить.
23 янв 18, 22:12    [21132295]     Ответить | Цитировать Сообщить модератору
 Re: Итоги 2017 года  [new]
rgreat
Member

Откуда:
Сообщений: 4582
Не, линукс не интересен.
23 янв 18, 22:24    [21132324]     Ответить | Цитировать Сообщить модератору
 Re: Итоги 2017 года  [new]
rgreat
Member

Откуда:
Сообщений: 4582
Kazantsev Alexey
Там того вывода...
Сотни страниц посимвольно.
23 янв 18, 22:26    [21132329]     Ответить | Цитировать Сообщить модератору
 Re: Итоги 2017 года  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3119
rgreat
Не, линукс не интересен.

Так он вообще-то кроссплатформенный...
23 янв 18, 22:26    [21132330]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
Все форумы / Delphi Ответить