powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Тяпничный бенчмарк CPU (part-1)
25 сообщений из 1 076, страница 1 из 44
Тяпничный бенчмарк CPU (part-1)
    #39042872
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здарова други!

Илья. Белая Сова. Дима-Т. Саша-Меркурий. Лётчик Петрав. Изопропил.
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
Тяпничный бенчмарк CPU (part-1)
    #39042877
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

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

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

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

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

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

Отформатировал. Переименовал имена сущностей в более читабельные.
Секции инициализации переменных переписал без запятой.
Не видя особого смысла в поддержке 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
Тяпничный бенчмарк CPU (part-1)
    #39042907
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зимарглmayton,

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

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

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

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

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

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

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

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

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

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

алгоритм сравнения картинок - это будет следующий этап )
...
Рейтинг: 0 / 0
Тяпничный бенчмарк CPU (part-1)
    #39043170
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилэто 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
Тяпничный бенчмарк CPU (part-1)
    #39043171
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T1. Добавить какой-нибудь расчет контрольной суммы для проверки результата. А то какая-то куча символов непонятная лезет.

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

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

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

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

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

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

Другое прикольное направление развития этого дела было бы задание других начальных данных для того, чтобы шарики на картинке
писали какие-то другие буквы, например, ZIV... -- т.е. твои инициалы.
И тогда можно было бы изготавливать персональные визитки таким образом.
Можно делать бизнес... такой странный гиковатый бизнес.
...
Рейтинг: 0 / 0
Тяпничный бенчмарк CPU (part-1)
    #39043208
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сюда фикс накатить. Правда я-бы предложил разобраться как матрицу растянуть.
И камеру чуть назад отодвинуть. Чтобы значить хотя-бы слово "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
Тяпничный бенчмарк CPU (part-1)
    #39043266
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЭто картинка. Ее можно открыть в IrfanView.
Поставил IrfanView - открывается.
...
Рейтинг: 0 / 0
Тяпничный бенчмарк CPU (part-1)
    #39043289
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поднял репозитарий на сорсфорже. Пока пустой. Туда буду заливать эксперименты.

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

Это необходимо в силу того что у всех - разное железо и придётся как-то сравнивать.
...
Рейтинг: 0 / 0
Тяпничный бенчмарк CPU (part-1)
    #39043366
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно просто вывести, результат. Думаю 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
Тяпничный бенчмарк CPU (part-1)
    #39043438
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, залил в репку .

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

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

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

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

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

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

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

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


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