Гость
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Тяпничный бенчмарк CPU (part-1) / 25 сообщений из 1 076, страница 1 из 44
03.09.2015, 22:09
    #39042872
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
Здарова други!

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

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

В продолжнение топика https://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.8MS.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

P.P.P.S. Результаты замера от 04.07.18 21541279
...
Рейтинг: 0 / 0
03.09.2015, 22:16
    #39042877
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
mayton,

я бы взялся на Python, а может даже и на Common моём любимом Lisp...
...
Рейтинг: 0 / 0
03.09.2015, 22:29
    #39042882
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
Ну ОК. Добавим позицию.

Щас приаттачу сорц.
...
Рейтинг: 0 / 0
03.09.2015, 22:31
    #39042883
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
mayton,

когда напишем -- тогда и добавим.
...
Рейтинг: 0 / 0
03.09.2015, 22:35
    #39042884
Зимаргл
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
mayton,

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

Разве что ручками приспособить векторные операторы типа SSE или GPU.
...
Рейтинг: 0 / 0
03.09.2015, 23:00
    #39042903
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
Слегка улучшенный сорц.

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

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

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

Код: plaintext
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.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
/**
 *  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);
		}
	}
}

...
Рейтинг: 0 / 0
03.09.2015, 23:04
    #39042907
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
Зимарглmayton,

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

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

Да и very-specific всё это. Мало кто поддержит IMHO.
...
Рейтинг: 0 / 0
03.09.2015, 23:36
    #39042927
ДохтаР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
maytonЗимарглmayton,

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

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

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

мне кажется что данный кейс будет тестировать скорость
общения процессора со своим кешем на любом языке программирования.
...
Рейтинг: 0 / 0
03.09.2015, 23:41
    #39042931
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
Наука говорит что отсутствие результата - тоже есть результат.

Впереди еще 2 бенчмарка.
...
Рейтинг: 0 / 0
04.09.2015, 09:37
    #39043096
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
Не совсем потял чего там считается, точнее ничего не понял :) Код понятен, остальное мелочи.
На С уже написано 18105911 , пусть будет эталоном. Только я бы подправил немного:
1. Добавить какой-нибудь расчет контрольной суммы для проверки результата. А то какая-то куча символов непонятная лезет.
2. функцию Random() заменить на генератор который во всех ЯП даст одинаковый результат.
3. Добавить замер времени.
Сделаю попозже.

ИМХУ задачка для алгоритмических ЯП. Попробую на фоксе переписать, хотя подобные считалки не самая сильная его сторона. C# чуть-чуть освоил, тоже попробую, заодно потренируюсь.
...
Рейтинг: 0 / 0
04.09.2015, 09:59
    #39043114
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
Dima T1. Добавить какой-нибудь расчет контрольной суммы для проверки результата. А то какая-то куча символов непонятная лезет.
это PPM, скорми ppm2tiff и любуйся

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

алгоритм сравнения картинок - это будет следующий этап )
...
Рейтинг: 0 / 0
04.09.2015, 10:55
    #39043170
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
Изопропилэто PPM, скорми ppm2tiff и любуйся
Скачал отсюда http://gnuwin32.sourceforge.net/packages/tiff.htm (Binaries и Dependencies в зипе)

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


1.ppmP6 512 512 255 ▼∟'▼∟'▼∟...

затем
Код: sql
1.
ppm2tiff.exe 1.ppm 1.tif


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

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

Хотел глянуть как изнутри правильный PPM должен выглядеть, но tiff2ppm нет в том пакете.
...
Рейтинг: 0 / 0
04.09.2015, 10:56
    #39043171
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
Dima T1. Добавить какой-нибудь расчет контрольной суммы для проверки результата. А то какая-то куча символов непонятная лезет.

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

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

Я думал о модульном тесте. Но если его суть заключается в нечётком сравнении картинок
то я-бы пока повременил. Думаю для нас достаточно будет визуальной оценки результата.
Открыть 2 браузера и сравнить 2 картинки глазами.
...
Рейтинг: 0 / 0
04.09.2015, 10:59
    #39043174
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
Dima Tвыдает "1.ppm: Not a PPM file."

Возможно. Старина Пол Гекберт использовал какой-то устаревший формат PPM с двоичным кодированием RGB
троек. Если переписать на текст где белый цвет выглядит как FFFFFF то думаю будет всё ОК.
...
Рейтинг: 0 / 0
04.09.2015, 11:10
    #39043188
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
maytonDima Tвыдает "1.ppm: Not a PPM file."

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

У меня открылся без вопросов...
...
Рейтинг: 0 / 0
04.09.2015, 11:13
    #39043192
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
mayton,

Другое прикольное направление развития этого дела было бы задание других начальных данных для того, чтобы шарики на картинке
писали какие-то другие буквы, например, ZIV... -- т.е. твои инициалы.
И тогда можно было бы изготавливать персональные визитки таким образом.
Можно делать бизнес... такой странный гиковатый бизнес.
...
Рейтинг: 0 / 0
04.09.2015, 11:22
    #39043208
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
Сюда фикс накатить. Правда я-бы предложил разобраться как матрицу растянуть.
И камеру чуть назад отодвинуть. Чтобы значить хотя-бы слово "mayton" влезло.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
        0x0003C712,  // 00111100011100010010 
	0x00044814,  // 01000100100000010100
	0x00044818,  // 01000100100000011000
	0x0003CF94,  // 00111100111110010100
	0x00004892,  // 00000100100010010010
	0x00004891,  // 00000100100010010001
	0x00038710,  // 00111000011100010000
	0x00000010,  // 00000000000000010000
	0x00000010,  // 00000000000000010000
...
Рейтинг: 0 / 0
04.09.2015, 12:09
    #39043266
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
maytonЭто картинка. Ее можно открыть в IrfanView.
Поставил IrfanView - открывается.
...
Рейтинг: 0 / 0
04.09.2015, 12:24
    #39043289
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
Поднял репозитарий на сорсфорже. Пока пустой. Туда буду заливать эксперименты.

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 . Создать отдельный репозитарий для каждой конфигурации. С последним
я думаю это будет не быстро т.к. сорсфорж ограничил меня в количестве создаваемых
проектов в сутки.
...
Рейтинг: 0 / 0
04.09.2015, 12:43
    #39043310
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
Делай по 1 варианту. Кода немного будет, не запутаемся.
...
Рейтинг: 0 / 0
04.09.2015, 12:48
    #39043321
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
Наверное нужно еще написать на шелле некий лаунчер который последовательно гоняет
все тесты по всем конфигурациям и формирует отчётик табличкой.

Это необходимо в силу того что у всех - разное железо и придётся как-то сравнивать.
...
Рейтинг: 0 / 0
04.09.2015, 13:12
    #39043366
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
Можно просто вывести, результат. Думаю 3-5 раз запустить и среднее записать сильно не напряжет.

Предлагаю дописать в С версию в конец
Код: plaintext
1.
2.
3.
4.
	fprintf(stderr, "Time %d msec", clock());
#ifdef WIN32
	system("pause");
#endif

и в начало
Код: plaintext
1.
#include <time.h>



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

Позапускал с выводом в файл >1.ppm
ПроцВремяi7-3770K 3.5 ГГц14.05 секi5-660 3.33 ГГц28.67 сек
...
Рейтинг: 0 / 0
04.09.2015, 14:05
    #39043438
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
Dima T, залил в репку .

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

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

Коллеги. Кому надо - дам доступ на write.
...
Рейтинг: 0 / 0
04.09.2015, 14:17
    #39043457
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
maytonDima Tвыдает "1.ppm: Not a PPM file."

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

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

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

а P6 - никак не устаревший
...
Рейтинг: 0 / 0
04.09.2015, 14:20
    #39043462
YesSql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный бенчмарк CPU (part-1)
неплохой тест для качества генерируемого кода компиляторами.

Компайлер Версия Время 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
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Тяпничный бенчмарк CPU (part-1) / 25 сообщений из 1 076, страница 1 из 44
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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