Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Программирование Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5] 6 7 8 9 10 .. 43   вперед  Ctrl
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
Dima T
Member

Откуда:
Сообщений: 13672
petalvik
Чуть изменил код Дмитрия.
...
Кроме структуры и инлайнинга, сделал ещё прямой вывод в файл.
...
Надо бы потестить, что именно улучшило результат:
  • прямой вывод в файл vs перенаправление вывода из консоли,
  • структура vs класс,
  • инлайнинг vs без него.

  • Сначала заменил вывод в консоль на в файл, потом тестил. Поэтому точка отсчета не совсем та же самая.
    В результате у меня прирост скорости 16%. Было 36,4 сек, стало 30,5 сек. Исходный на С 14,2 сек.

    В основном за счет замены класса на структуру. После замены стало 30,8 сек. Я ожидал такого, C# по другому со структурами работает, сразу хотел структуру сделать, но не компилировалось, разбираться некогда было.
    Переделка Random() еще 0,2-0,3 сек.
    Сам вывод в файл очень мало занимает, пробовал его камментить - время не меняется.

    Это затестить не смог, т.к. в моем .Net 4.0 этого нет
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    

    Возможно у тебя он дал еще 20% прироста (в твоем замере быстрее на 36%)
    Затести насколько эта строчка влияет.

    Я заинлайнил только Random(), точнее просто заменил в коде все вызовы на rand.NextDouble()

    Код со всеми изменениями залил.
    6 сен 15, 10:35    [18114558]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 13672
    MasterZiv
    Не получается в GUI -- поставь обычный SVN, комманд-лайн. Если у тебя Tortoise, или ещё что-то, там комманд-лайн клиента нет вообще

    У меня Tortoise, уже разобрался. Заработало. Надо из того что предлагается в URL писать только выделенное
    svn checkout --username=dmitriyt svn+ssh://dmitriyt@svn.code.sf.net/p/card-raytracer-bench/code/ card-raytracer-bench-code
    6 сен 15, 10:42    [18114566]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 13672
    kealon(Ruslan)
    надо бы генератор случайных чисел один для всех использовать

    Тоже была такая мысль, но на итог он мало влияет 18108725

    Кстати для варианта С++ он выдает стабильно один и тот же ряд, т.к. srand() нет.
    6 сен 15, 10:50    [18114581]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 4613
    Dima T
    kealon(Ruslan)
    надо бы генератор случайных чисел один для всех использовать

    Тоже была такая мысль, но на итог он мало влияет 18108725

    Кстати для варианта С++ он выдает стабильно один и тот же ряд, т.к. srand() нет.

    это просто для отладки удобно на других языках, да и алгоритм будет одинаковый как и результат
    6 сен 15, 10:54    [18114590]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 40738
    52 секунды на Java. Но рисуется вот такая лажа. :)

    К сообщению приложен файл. Размер - 29Kb
    6 сен 15, 11:01    [18114601]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 40738
    Я не буду постить простыни кода. Просто приведу ссылку на svn. Так удобнее.

    http://sourceforge.net/p/card-raytracer-bench/code/14/tree/trunk/java/src/main/java/mayton/CardRaytracer.java
    6 сен 15, 11:07    [18114612]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 40738
    kealon(Ruslan)
    mayton,

    надо бы генератор случайных чисел один для всех использовать
    предлагаю вот такой, самый примитивный но пойдёт для этого случая
     #define M 1048576 // 2^20
     #define J  2045
    int  oldI =12357;
    
    
    double Random() {
       oldI=(oldI*J+1)% M;
       return (double)  oldI/ M;
    	//return (double) rand() / RAND_MAX;
    }
    

    Поддерживаю. Можно.
    6 сен 15, 11:12    [18114622]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 40738
    MasterZiv
    Написал пор на Python.
    Запустил.
    До сих пор работает...
    :-)

    Провалился рекурсию :). Коммить будем смотреть.
    6 сен 15, 11:15    [18114627]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 13672
    mayton
    kealon(Ruslan)
    mayton,

    надо бы генератор случайных чисел один для всех использовать

    Поддерживаю. Можно.

    Заменил в C# стало даже быстрее по сравнению со встроенным.
    Затестил
    double Random() {
       return 0;
    }
    

    Картинка визуально не изменилась :)
    6 сен 15, 11:20    [18114634]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 40738
    Изопропил, ого букв. А можно какой-то анализ с каментами по поводу профилирования?
    6 сен 15, 11:25    [18114637]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 4613
    mayton,
    внёс fpc версию
    вроде один в один перенёс
    6 сен 15, 11:30    [18114642]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 4613
    кстати, под виндой после каждого файлого вывода она задачу переключает частенько и довольно долго не отдаёт время
    на linux (ext4) заметно шустрее перенаправление в файл работает
    6 сен 15, 11:34    [18114648]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 40738
    Dima T
    kealon(Ruslan)
    надо бы генератор случайных чисел один для всех использовать

    Тоже была такая мысль, но на итог он мало влияет 18108725

    Кстати для варианта С++ он выдает стабильно один и тот же ряд, т.к. srand() нет.

    Свой собственный линейный конгруэнтный генератор нам может понадобиться
    только в том случае когда модульный тест будет численно-точный.

    Я-бы пока предложил задаться критерием близости двух картинок и допускать
    что "шумящие" тени на заднем фоне шумят случайным образом и не должны совпадать
    в 2х реализациях в 2х разных языках/платформерах.
    6 сен 15, 11:46    [18114667]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 40738
    kealon(Ruslan)
    mayton,
    внёс fpc версию
    вроде один в один перенёс

    Спасибо.
    6 сен 15, 12:00    [18114694]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    softwarer
    Member

    Откуда: 127.0.0.1
    Сообщений: 57005
    Блог
    MasterZiv
    Не получается в GUI -- поставь обычный SVN, комманд-лайн. Если у тебя Tortoise, или ещё что-то, там комманд-лайн клиента нет вообще (кажется), они через протокол работают.

    Tortoise уже лет пять как сопровождается svn.exe.
    6 сен 15, 12:39    [18114773]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 4613
    mayton
    Dima T
    пропущено...

    Тоже была такая мысль, но на итог он мало влияет 18108725

    Кстати для варианта С++ он выдает стабильно один и тот же ряд, т.к. srand() нет.

    Свой собственный линейный конгруэнтный генератор нам может понадобиться
    только в том случае когда модульный тест будет численно-точный.

    Я-бы пока предложил задаться критерием близости двух картинок и допускать
    что "шумящие" тени на заднем фоне шумят случайным образом и не должны совпадать
    в 2х реализациях в 2х разных языках/платформерах.

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

    PS: приоритет выполнения конечно стоит учесть
    6 сен 15, 13:56    [18114921]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 13672
    Провел небольшой тест потенциальной выгоды от замены перегрузки операторов
    + Исходник
    using System;
    using System.Text;
    using System.IO;
    using System.Diagnostics;
    
    namespace TestCPU1 {
    
        public struct Vector {
    
            public Double x, y, z;
    
            public Vector(Double a, Double b, Double c) {
                x = a;
                y = b;
                z = c;
            }
    
            public void Add1(Vector v)
            {
                x += v.x;
                y += v.y;
                z += v.z;
            }
    
            public void Add2(ref Vector v) {
                x += v.x;
                y += v.y;
                z += v.z;
            }
    
            public static void Add3(ref Vector i, ref Vector v) {
                i.x += v.x;
                i.y += v.y;
                i.z += v.z;
            }
    
            public static Vector operator +(Vector v, Vector r) {
                return new Vector(v.x + r.x, v.y + r.y, v.z + r.z);
            }
    
            public override String ToString()
            {
                return "{" + x.ToString() + "," + y.ToString() + "," + z.ToString() + "}";
            }
        };
    
       
        class Program {
    
            static Vector Test1() {
                Vector q = new Vector(1, 1, 1);
                Vector f = new Vector(2, 2, 2);
                for (Int32 i = 1000000000; i > 0; i--) {
                    q = q + f;
                }
                return q;
            }
    
            static Vector Test2() {
                Vector q = new Vector(1, 1, 1);
                Vector f = new Vector(2, 2, 2);
                for (Int32 i = 1000000000; i > 0; i--) {
                    q.Add1(f);
                }
                return q;
            }
    
            static Vector Test3() {
                Vector q = new Vector(1, 1, 1);
                Vector f = new Vector(2, 2, 2);
                for (Int32 i = 1000000000; i > 0; i--) {
                    q.Add2(ref f);
                }
                return q;
            }
    
            static Vector Test4() {
                Vector q = new Vector(1, 1, 1);
                Vector f = new Vector(2, 2, 2);
                for (Int32 i = 1000000000; i > 0; i--) {
                    Vector.Add3(ref q, ref f);
                }
                return q;
            }
    
            static void Main(string[] args) {
    
                Stopwatch sw = new Stopwatch();
                Vector r;
    
                sw.Restart();
                r = Test1();
                sw.Stop();
                Console.WriteLine("Test1 {0} msec {1}", sw.ElapsedMilliseconds, r);
    
                sw.Restart();
                r = Test2();
                sw.Stop();
                Console.WriteLine("Test2 {0} msec {1}", sw.ElapsedMilliseconds, r);
    
                sw.Restart();
                r = Test3();
                sw.Stop();
                Console.WriteLine("Test3 {0} msec {1}", sw.ElapsedMilliseconds, r);
    
                sw.Restart();
                r = Test4();
                sw.Stop();
                Console.WriteLine("Test4 {0} msec {1}", sw.ElapsedMilliseconds, r);
    
                Console.WriteLine("Press any key ...");
                Console.ReadKey();
                return;
            }
        }
    }
    
    Результат
    Test1 1441 msec
    Test2 721 msec
    Test3 721 msec
    Test4 721 msec

    Вывод: можно код до двух раз ускорить, если избавиться от перегруженных операторов.

    PS softwarer, у меня нет svn.exe версию не знаю где глянуть, все exe от июля 2013, так то пофиг, работает.
    6 сен 15, 14:13    [18114957]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

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

    Я думаю что здесь еще не учтено большое количество факторов таких как
  • Округления кастинга (double -> int)
  • Разрядность вещественного числа 80/64/32
  • Округления функцией ceil.
  • 6 сен 15, 14:14    [18114958]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 4613
    mayton
    kealon(Ruslan)
    немного не так донёс свою мысль
    это удобно при отладке тем, что остановка в одинаковых местах должна давать одинаковые значения переменных

    Я думаю что здесь еще не учтено большое количество факторов таких как
  • Округления кастинга (double -> int)
  • Разрядность вещественного числа 80/64/32
  • Округления функцией ceil.

  • из всего этого:
    если 64-битный double заменить на 80-битный, то да - разница довольно существенная (под виндой правда надо точность вычисления GPU увеличить)

    но если типы один в один использовать, то значения совпадают (я на твоём коде проверял, g++ и fpc, linux mint)


    PS: а вообще из графики мне бы было интересна такая смежная тема как построение голограммы, восстановление изображения из голограммы - мне кажется вторую часть можно делать очень быстро, а это заметное убыстрение 3D-рендера
    6 сен 15, 14:31    [18115003]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 40738
    kealon(Ruslan)
    PS: а вообще из графики мне бы было интересна такая смежная тема как построение голограммы, восстановление изображения из голограммы - мне кажется вторую часть можно делать очень быстро, а это заметное убыстрение 3D-рендера

    Не совсем понятно. Обычный 2D Монитор в принципе не способен показывать голограммы. Наверное речь была о другом.
    6 сен 15, 15:43    [18115193]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 4613
    mayton
    Не совсем понятно. Обычный 2D Монитор в принципе не способен показывать голограммы. Наверное речь была о другом.

    зато имею голограмму можно восстановить изображение с почти с любого ракурса
    6 сен 15, 15:50    [18115209]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 40738
    Коллеги.

    Добавил в корень два главных скриптика.
    +
    Revision: 20
    Author: mayton
    Date: Sunday, September 06, 2015 4:05:32 PM
    Message:
    General: added general scripts.
    - run-benchmark.cmd (Windows platform)
    - run-benchmark.sh (Linux/Unix platform)
    ----
    Added : /trunk/run-benchmark.cmd
    Added : /trunk/run-benchmark.sh
    


    Давайте обсудим автоматизацию запуска всех наших доработок
    в пакетном режиме и формирование отчёта.

    Несколько мыслей.
  • Для замера времени можно использовать timethis
    Пример
    $ timethis java -server -jar CardRaytracer.jar -nostdout >> timereport.txt
    

  • Можно формировать отчет в форматах: sql.ru (с тегами CSV), и в HTML для публикаций
  • 6 сен 15, 16:17    [18115251]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 13672
    Вникаю постепенно в суть, задача очень хорошо параллелится. Интересно было бы оценить решение на GPU (CUDA, OpenCL). Может кто попробует?
    6 сен 15, 16:51    [18115312]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 40738
    Да. В задаче почти нету разделяемых исходных данных. Синхронизация не нужна. Вобщем можно запускать
    столько Worker threads сколько выдержит ваша старая развалина.

    Но задачу с мультипоточностью хотелось бы изучить потом. Когда получим хотя-бы данные по нашим
    однопоточным процессам.
    6 сен 15, 17:02    [18115323]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 40738
    По поводу Pascal. Нужны скриптики для сборки. И инструкция. Какое ПО надо ставить.
    Какие ключики компилляции.

    По поводу js. Тоже самое.
    6 сен 15, 18:08    [18115418]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5] 6 7 8 9 10 .. 43   вперед  Ctrl
    Все форумы / Программирование Ответить