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

Откуда: loopback
Сообщений: 37448
Здарова други!

Илья. Белая Сова. Дима-Т. Саша-Меркурий. Лётчик Петрав. Изопропил.
Petalvik. Softwarer. Володя двухтысячный. Сидоров. Анонимосы. И Базист.


И все остальные мемберы этого форума и модеры.

В продолжнение топика http://www.sql.ru/forum/1172924-1/o-primenimost-yazykov

Я долго искал задачку которая меряет достаточно шИроко CPU и при этом мало задействует
memory+I/O. И нашёл. Оригинал здесь http://tproger.ru/translations/business-card-raytracer/

Card-raytraсer - это довольно компактное (2k) приложение на С++ которое моделирует т.н. алгоритм
обратной трассировки луча
. Это демка. Или tech-demo. Ее полезным результатом является графичский
файл который демонстрирует возможности машинной графики. Время работы - небольшое.
Около 1 минуты.

У меня имеется отфильтрованная и отформатированная до читабельности версия сорца на С++
Чуть позже я ее опубликую.

Задание.

1. Портировать приложение Card-raytraсer с С++ на Java/C#/Python
2. Замерять производительность на одной конфигурации железа


Нужно получить что-то вроде таблички.

Card-raytraсer benchmarks
ConfigurationElapsed time(+STDOUT)Elapsed time(no out)
MinGW/MS/C++
Oracle/Java/1.7/1.8
MS.Net/C#
Python/psyco


3. Сделать выводы.

Заметки и мысли:


  • При портировании Card-raytraсer можно в принципе менять код для удобства воспроизведения
    в конкретном ЯП. Можно менять типы float -> double, юзать другие структуры данных и дженерики
    с шаблонами. Единственное ограничение - алгоритм а в особенности его сложность
    должны остаться без изменения. Тоесть количество рекурсивных отражений луча от шаров
    должны быть сохранены. Для полноты сравнения нужно сравнить исходные данные. Конфигурацию
    сцены, количество предметов и разрешение картинки (по дефолту 512х512) желательно
    также сохранить.

  • Можно поиграть с ключами оптимизации сред и компилляторов для достижения нужного эффекта.
    Для более точного замера времени можно сделать 3-5 запусков одного и того же entry-point
    с усреднением.

  • Если вывод на STDOUT станет узким местом то его можно закомментарить и сделать замер
    времени работы алгоритма без вывода. Для этого я предусмотрел 3-ю колонку таблицы.

  • Количество ЯП и конфигураций вобщем-то не ограничивается. Хотя в топике выше мы обсуждали
    С++/Java в основном.

    С уважением ваш покорный слуга
    mayton.

    P.S. Следующие 2 бенчмарка должны охватывать Memory + I/O.

    P.P.S. Все исходники для замеров на githab
  • 3 сен 15, 22:09    [18105781]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    MasterZiv
    Member

    Откуда: Питер
    Сообщений: 34250
    mayton,

    я бы взялся на Python, а может даже и на Common моём любимом Lisp...
    3 сен 15, 22:16    [18105808]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 37448
    Ну ОК. Добавим позицию.

    Щас приаттачу сорц.
    3 сен 15, 22:29    [18105840]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    MasterZiv
    Member

    Откуда: Питер
    Сообщений: 34250
    mayton,

    когда напишем -- тогда и добавим.
    3 сен 15, 22:31    [18105842]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    Зимаргл
    Guest
    mayton,

    Ну и на этом тесте ты получишь распределение как на Scimarke.

    Разве что ручками приспособить векторные операторы типа SSE или GPU.
    3 сен 15, 22:35    [18105848]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 37448
    Слегка улучшенный сорц.

    Отформатировал. Переименовал имена сущностей в более читабельные.
    Секции инициализации переменных переписал без запятой.
    Не видя особого смысла в поддержке float - переписал на другой тип.
    Развернул typedefs. Добавил некоторые макросы.
    Матрицу "шаров" просто переписал в hex-константах чтоб было наглядно.

    Поскольку юнит теста не было - просто повторно запустил и сравнил картинку.
    Вроде ничего не поломал.

    Вобщем готово. Go! Go!
    +

    /**
     *  Special thanks to Paul Heckbert
     *
     *  http://tproger.ru/translations/business-card-raytracer
     */
    
    #include <stdlib.h>   
    #include <stdio.h>
    #include <math.h>
    
    #define WIDTH  512
    #define HEIGHT 512
    
    struct Vector {
    
    	Vector() {
    	}
    
    	Vector(double a, double b, double c) {
    		x = a;
    		y = b;
    		z = c;
    	}
    
    	double x, y, z;
    
    	Vector operator+(Vector r) {
    		return Vector(x + r.x, y + r.y, z + r.z);
    	}
    
    	Vector operator*(double r) {
    		return Vector(x * r, y * r, z * r);
    	}
    
    	double operator%(Vector r) {
    		return x * r.x + y * r.y + z * r.z;
    	}
    
    	Vector operator^(Vector r) {
    		return Vector(y * r.z - z * r.y, z * r.x - x * r.z, x * r.y - y * r.x);
    	}
    	
    	Vector operator!() {
    		return *this * (1 / sqrt(*this % *this));
    	}
    };
    
    int G[] = { 
    	0x0003C712,  // 00111100011100010010 
    	0x00044814,  // 01000100100000010100
    	0x00044818,  // 01000100100000011000
    	0x0003CF94,  // 00111100111110010100
    	0x00004892,  // 00000100100010010010
    	0x00004891,  // 00000100100010010001
    	0x00038710,  // 00111000011100010000
    	0x00000010,  // 00000000000000010000
    	0x00000010,  // 00000000000000010000
    };
    
    double Random() {
    	return (double) rand() / RAND_MAX;
    }
    
    int tracer(Vector o, Vector d, double &t, Vector& n) {
    	t = 1e9;
    	int m = 0;
    	double p = -o.z / d.z;
    	if (.01 < p){
    		t = p;
    		n = Vector(0, 0, 1);
    		m = 1;
    	}
    	for (int k = 19; k--;)
    		for (int j = 9; j--;)
    			if (G[j] & 1 << k) {
    				Vector p = o + Vector(-k, 0, -j - 4);
    				double b = p % d; 
                                    double c = p % p - 1; 
                                    double q = b * b - c;
    				if (q > 0) {
    					double s = -b - sqrt(q);
    					if (s < t && s > .01) {
    						t = s; 
    						n = !(p + d * t);
    						m = 2;
    					}
    				}
    			}
    	return m;
    }
    
    Vector sampler(Vector o, Vector d) {
    	double t;
    	Vector n;
    	int m = tracer(o, d, t, n);
    	if (!m){
    		return Vector(.7, .6, 1) * pow(1 - d.z, 4);
    	}
    	Vector h = o + d * t;
            Vector l = !(Vector(9 + Random(), 9 + Random(), 16) + h * -1);
            Vector r = d + n * (n % d * -2);
    	double b = l % n;
    	if (b < 0 || tracer(h, l, t, n)){
    		b = 0;
    	}
    	double p = pow(l % r * (b > 0), 99);
    	if (m & 1) {
    		h = h * .2;
    		return ((int) (ceil(h.x) + ceil(h.y)) & 1 ? Vector(3, 1, 1) : Vector(3, 3, 3)) * (b * .2 + .1);
    	}
    	return Vector(p, p, p) + sampler(h, r) * .5;
    }
    
    int main(int argc,char **argv) {
    	printf("P6 %d %d 255 ",WIDTH,HEIGHT);
    	Vector g = !Vector(-6, -16, 0);
            Vector a = !(Vector(0, 0, 1) ^ g) * .002; 
            Vector b = !(g ^ a) * .002;
            Vector c = (a + b) * -256 + g;
    	for (int y = HEIGHT; y--;) {
    		for (int x = WIDTH; x--;) {
    			Vector p(13, 13, 13);
    			for (int r = 64; r--;) {
    				Vector t = a * (Random() - .5) * 99 + b * (Random() - .5) * 99;
    				p = sampler(Vector(17, 16, 8) + t, !(t * -1 + (a * (Random() + x) + b * (y + Random()) + c) * 16)) * 3.5 + p;
    			}
    			printf("%c%c%c", (int) p.x, (int) p.y, (int) p.z);
    		}
    	}
    }
    
    3 сен 15, 23:00    [18105911]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 37448
    Зимаргл
    mayton,

    Ну и на этом тесте ты получишь распределение как на Scimarke.

    Разве что ручками приспособить векторные операторы типа SSE или GPU.

    Думаю что обсуждать GPU нет особого смысла. Мы ведь сравнивали языки-платформеры
    и обсуждали memory-management. Как к этой теме прикрутить обсуждение GPU - я не знаю.

    Да и very-specific всё это. Мало кто поддержит IMHO.
    3 сен 15, 23:04    [18105921]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    ДохтаР
    Member [заблокирован]

    Откуда: Новоукраинск
    Сообщений: 16864
    mayton
    Зимаргл
    mayton,

    Ну и на этом тесте ты получишь распределение как на Scimarke.

    Разве что ручками приспособить векторные операторы типа SSE или GPU.

    Думаю что обсуждать GPU нет особого смысла. Мы ведь сравнивали языки-платформеры
    и обсуждали memory-management. Как к этой теме прикрутить обсуждение GPU - я не знаю.

    Да и very-specific всё это. Мало кто поддержит IMHO.


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

    Откуда: loopback
    Сообщений: 37448
    Наука говорит что отсутствие результата - тоже есть результат.

    Впереди еще 2 бенчмарка.
    3 сен 15, 23:41    [18106002]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 12464
    Не совсем потял чего там считается, точнее ничего не понял :) Код понятен, остальное мелочи.
    На С уже написано 18105911, пусть будет эталоном. Только я бы подправил немного:
    1. Добавить какой-нибудь расчет контрольной суммы для проверки результата. А то какая-то куча символов непонятная лезет.
    2. функцию Random() заменить на генератор который во всех ЯП даст одинаковый результат.
    3. Добавить замер времени.
    Сделаю попозже.

    ИМХУ задачка для алгоритмических ЯП. Попробую на фоксе переписать, хотя подобные считалки не самая сильная его сторона. C# чуть-чуть освоил, тоже попробую, заодно потренируюсь.
    4 сен 15, 09:37    [18106733]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    Изопропил
    Member

    Откуда:
    Сообщений: 30799
    Dima T
    1. Добавить какой-нибудь расчет контрольной суммы для проверки результата. А то какая-то куча символов непонятная лезет.

    это PPM, скорми ppm2tiff и любуйся

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

    алгоритм сравнения картинок - это будет следующий этап )
    4 сен 15, 09:59    [18106857]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 12464
    Изопропил
    это PPM, скорми ppm2tiff и любуйся

    Скачал отсюда http://gnuwin32.sourceforge.net/packages/tiff.htm (Binaries и Dependencies в зипе)

    сохраняю вывод твоего кода в 1.ppm
    TestCPU1.exe >1.ppm
    

    1.ppm
    P6 512 512 255 ▼∟'▼∟'▼∟...

    затем
    ppm2tiff.exe 1.ppm 1.tif
    

    выдает "1.ppm: Not a PPM file."

    Попробовал код оригинала http://tproger.ru/translations/business-card-raytracer/ тоже самое.
    похоже какой-то неправильный ppm2tiff.exe или я не так запускаю

    Хотел глянуть как изнутри правильный PPM должен выглядеть, но tiff2ppm нет в том пакете.
    4 сен 15, 10:55    [18107247]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 37448
    Dima T
    1. Добавить какой-нибудь расчет контрольной суммы для проверки результата. А то какая-то куча символов непонятная лезет.

    Это картинка. Ее можно открыть в IrfanView.

    Проверять контрольные суммы не стоит. Мы имеем дело с численным методом который использует
    плавающую арифметику точность которой зависит от имплементации в конкретных средах и ЯП.

    Я думал о модульном тесте. Но если его суть заключается в нечётком сравнении картинок
    то я-бы пока повременил. Думаю для нас достаточно будет визуальной оценки результата.
    Открыть 2 браузера и сравнить 2 картинки глазами.
    4 сен 15, 10:56    [18107259]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 37448
    Dima T
    выдает "1.ppm: Not a PPM file."

    Возможно. Старина Пол Гекберт использовал какой-то устаревший формат PPM с двоичным кодированием RGB
    троек. Если переписать на текст где белый цвет выглядит как FFFFFF то думаю будет всё ОК.
    4 сен 15, 10:59    [18107279]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    MasterZiv
    Member

    Откуда: Питер
    Сообщений: 34250
    mayton
    Dima T
    выдает "1.ppm: Not a PPM file."

    Возможно. Старина Пол Гекберт использовал какой-то устаревший формат PPM с двоичным кодированием RGB
    троек. Если переписать на текст где белый цвет выглядит как FFFFFF то думаю будет всё ОК.


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

    Откуда: Питер
    Сообщений: 34250
    mayton,

    Другое прикольное направление развития этого дела было бы задание других начальных данных для того, чтобы шарики на картинке
    писали какие-то другие буквы, например, ZIV... -- т.е. твои инициалы.
    И тогда можно было бы изготавливать персональные визитки таким образом.
    Можно делать бизнес... такой странный гиковатый бизнес.
    4 сен 15, 11:13    [18107377]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 37448
    Сюда фикс накатить. Правда я-бы предложил разобраться как матрицу растянуть.
    И камеру чуть назад отодвинуть. Чтобы значить хотя-бы слово "mayton" влезло.

            0x0003C712,  // 00111100011100010010 
    	0x00044814,  // 01000100100000010100
    	0x00044818,  // 01000100100000011000
    	0x0003CF94,  // 00111100111110010100
    	0x00004892,  // 00000100100010010010
    	0x00004891,  // 00000100100010010001
    	0x00038710,  // 00111000011100010000
    	0x00000010,  // 00000000000000010000
    	0x00000010,  // 00000000000000010000
    
    4 сен 15, 11:22    [18107426]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 12464
    mayton
    Это картинка. Ее можно открыть в IrfanView.

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

    Откуда: loopback
    Сообщений: 37448
    Поднял репозитарий на сорсфорже. Пока пустой. Туда буду заливать эксперименты.

    https://sourceforge.net/p/card-raytracer-bench/code/HEAD/tree/

    Прошу прощения что не Git. С последним я работаю недавно и еще не могу
    оперативно решать вопросы. Есть также некоторые идейные завтыки которые
    меня ставят пока в состояние ступора (merge vs rebase к примеру).

    Поэтому пока SVN

    Вопрос ко всем. Какова должна быть структура? Как удобнее.

    Вариант 1. Создать в транке директории /trunk/cpp, /trunk/python, /branches/java ... etc. Это простой и плоский вариант.

    Вариант 2. Работать в транке на сях. В бранчах иметь /branches/pyhon, /branches/java

    Вариант 3. Создать отдельный репозитарий для каждой конфигурации. С последним
    я думаю это будет не быстро т.к. сорсфорж ограничил меня в количестве создаваемых
    проектов в сутки.
    4 сен 15, 12:24    [18107861]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 12464
    Делай по 1 варианту. Кода немного будет, не запутаемся.
    4 сен 15, 12:43    [18108017]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 37448
    Наверное нужно еще написать на шелле некий лаунчер который последовательно гоняет
    все тесты по всем конфигурациям и формирует отчётик табличкой.

    Это необходимо в силу того что у всех - разное железо и придётся как-то сравнивать.
    4 сен 15, 12:48    [18108072]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 12464
    Можно просто вывести, результат. Думаю 3-5 раз запустить и среднее записать сильно не напряжет.

    Предлагаю дописать в С версию в конец
    	fprintf(stderr, "Time %d msec", clock());
    #ifdef WIN32
    	system("pause");
    #endif
    
    и в начало
    #include <time.h>
    


    Или может сразу прописать вывод в конкретный файл в текущей папке? Например test-c.ppm, test-java.ppm и т.д.
    Какой смысл перенаправлять в разные если каждый раз одно и тоже пишется.

    Позапускал с выводом в файл >1.ppm
    ПроцВремя
    i7-3770K 3.5 ГГц14.05 сек
    i5-660 3.33 ГГц28.67 сек
    4 сен 15, 13:12    [18108270]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 37448
    Dima T, залил в репку .

    https://sourceforge.net/p/card-raytracer-bench/code/HEAD/tree/trunk/cpp/card-raytracer.cpp

    Напомни свой ник. Добавлю.

    Коллеги. Кому надо - дам доступ на write.
    4 сен 15, 14:05    [18108593]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    Изопропил
    Member

    Откуда:
    Сообщений: 30799
    mayton
    Dima T
    выдает "1.ppm: Not a PPM file."

    Возможно. Старина Пол Гекберт использовал какой-то устаревший формат PPM с двоичным кодированием RGB
    троек. Если переписать на текст где белый цвет выглядит как FFFFFF то думаю будет всё ОК.


    Старина честно использовал пробел как whitespace :)

    замена на \n решает проблему.

    а P6 - никак не устаревший
    4 сен 15, 14:17    [18108687]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    YesSql
    Guest
    неплохой тест для качества генерируемого кода компиляторами.

    Компайлер Версия Время
    Intel 15.0.3 08.816
    clang 3.4.2 16.433
    GCC 4.8.3 16.516


    cat /proc/cpuinfo | grep model
    model name : Intel(R) Xeon(R) CPU E5-2643 0 @ 3.30GHz
    4 сен 15, 14:20    [18108708]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: [1] 2 3 4 5 6 7 8 9 10 .. 41   вперед  Ctrl
    Все форумы / Программирование Ответить