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

Откуда:
Сообщений: 31109
wst
Если уж предобрабатывать, то уж до массива из Vector-ов с центрами сфер для каждого бита. Кстати, кроме паскалевских - больше ни для каких языков опции компилятора что-то не видать.

gcc -O3 -ffast-math

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

Откуда: loopback
Сообщений: 40738
wst
Если уж предобрабатывать, то уж до массива из Vector-ов с центрами сфер для каждого бита. Кстати, кроме паскалевских - больше ни для каких языков опции компилятора что-то не видать.

Для Java (javac) из таковых я смог придумать только -g:none - отключение
отладночной информации в байткоде.

И для java включение режима работы -server и установка порога компилляции в
минимальный CompileThreshold=1.

Чуть позже я их опубликую. Пока борюсь с тем что maven не передает некоторые опции
командной строки. А без этого у меня не получается единая точка компилляции-запуска.
6 сен 15, 22:52    [18116496]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
wst
Member

Откуда:
Сообщений: 202
Изопропил
дальнейший тьюнинг много не даёт

-fprofile-use, например, дает, на i3-4130 с 24 до 17 секунд.
6 сен 15, 22:59    [18116514]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 40738
Есть у меня дурацкий код. Например вот такой. Безсмысленно аллоцировать новый вектор
лишь для того чтобы домножить x,y,z на константу. И подобных (завуалированных) глупых
аллокаций много.
h = h.prod(0.2);

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

Откуда: loopback
Сообщений: 40738
wst
Изопропил
дальнейший тьюнинг много не даёт

-fprofile-use, например, дает, на i3-4130 с 24 до 17 секунд.

Я буквально сегодня почитал на хабре статью про GCC Profile-guided optimization.
И думаю что можно сделать уже "перекур" на 24 секундах. PGO
сильно зависит от гистограммы входных данных и если мы выкинем
наши зеркальные шарики и заменим их скажем на полу-прозрачные
матовые стеклянные мячи то sampler + tracer пойдут по другому профилю
бох его знает какой будет отклик.
6 сен 15, 23:07    [18116524]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
Кузнецов Евгений
Guest
mayton,

Еще по поводу оптимизации. Vector у нас 192 бита, и мы его гоняем туда-сюда. Наверное, имеет смысл добавить перегрузки методов для варианта передачи по ссылке.
6 сен 15, 23:14    [18116544]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
Кузнецов Евгений
Guest
wst
Если уж предобрабатывать, то уж до массива из Vector-ов с центрами сфер для каждого бита.

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

Откуда:
Сообщений: 202
Пока вся сцена захардкожена - pgo тут просто напрашивается.
6 сен 15, 23:17    [18116549]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 40738
Кузнецов Евгений
mayton,

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

Я не против. Но не забываем про рекурсию. Возможно в некоторых местах кода клонирование - обосновано.

Вообще я попытался в wiki https://sourceforge.net/p/card-raytracer-bench/wiki/Home/
описать главную цель. Это оценка индекса производительности портированной с С++ программы
на целое семейство языков платформеров которые используют управляемый memory management.

У нас нет задачи "пилить" С++ "любой ценой".

Я еще подумаю над тезисами и допишу. А то к сожалению вижу что мемберы заняты только С++
6 сен 15, 23:24    [18116556]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
Кузнецов Евгений
Guest
Изопропил
да, помогло


mulpd ? Там SSE хорошо бы легло для 4-х float. Интересно, заметно ли double vs float на картинке
6 сен 15, 23:25    [18116558]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
Кузнецов Евгений
Guest
mayton,

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

Откуда: loopback
Сообщений: 40738
Кузнецов Евгений
mayton,

передача по ссылке для любой реализации имеет смысл, и Java в том числе

Java из коробки всё передаёт по ссылке. Кроме primitive types.
6 сен 15, 23:28    [18116566]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
Кузнецов Евгений
Guest
mayton,

О, а вот в C# это пойдет по значению. Наверное, нужно на каждом языке максимально использовать его возможности (не скатываясь в asm-вставки и intrinsics). PGO, с одной стороны, возможность компилятора, с другой - кроме C++ есть ли она где?
6 сен 15, 23:33    [18116575]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 40738
Евгений я в вашем вопросе не услышал вопроса. Наверное фраза была риторической?
6 сен 15, 23:36    [18116584]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
Изопропил
Member

Откуда:
Сообщений: 31109
Кузнецов Евгений
Изопропил
да, помогло


mulpd ? Там SSE хорошо бы легло для 4-х float. Интересно, заметно ли double vs float на картинке


помогла замена G на массив координат
float на качество картинки не влияет
насчёт SSE / float - можно и double на AVX сделать на интринсиках
6 сен 15, 23:50    [18116609]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
Изопропил
Member

Откуда:
Сообщений: 31109
mayton
А то к сожалению вижу что мемберы заняты только С++

там больше простора для экспериментов
7 сен 15, 00:06    [18116630]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 40738
Ну ОК
7 сен 15, 00:14    [18116643]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
Зимаргл
Guest
Изопропил
wst
Если уж предобрабатывать, то уж до массива из Vector-ов с центрами сфер для каждого бита. Кстати, кроме паскалевских - больше ни для каких языков опции компилятора что-то не видать.

gcc -O3 -ffast-math

дальнейший тьюнинг много не даёт

-O3 была и осталась глючной. Сегодня только работающая программа с -О2 отказалась работать с -O3. gcc 5.2

Так что нужно еще смотреть на получаемую картинку после оптимизации.

Кстати, если в конец файла картинки .ppm дописать строчку типа "running time 100sec" то картинка не портится.

На dlang я перевел без проблем. Но при переводе в лоб скорость ужасная, хотя картинка верная. Разбираюсь.

Векторные расширения в D пока ограниченно поддерживаются (http://dlang.org/simd.html - только x64 или макось), но дело не в них.
Операции с массивами же включают SSE2 при размере массива > 7
7 сен 15, 00:21    [18116649]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 40738
Зимаргл
На dlang я перевел без проблем. Но при переводе в лоб скорость ужасная, хотя картинка верная. Разбираюсь.

Это уже лучше чем у меня. У меня скорость 37 секунд а картинка - развал. Предпочёл-бы твой вариант. Кстати
ожидаю от тебя запроса на добавление в группу Developers.
7 сен 15, 00:27    [18116651]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
Зимаргл
Guest
mayton
Зимаргл
На dlang я перевел без проблем. Но при переводе в лоб скорость ужасная, хотя картинка верная. Разбираюсь.

Это уже лучше чем у меня. У меня скорость 37 секунд а картинка - развал. Предпочёл-бы твой вариант. Кстати
ожидаю от тебя запроса на добавление в группу Developers.

Лень мне возиться с SVN.
Код
+
import std.stdio;
import std.math;
import std.random;
import std.datetime;

immutable int WIDTH  =  512;
immutable int HEIGHT =  512;

int G[] = [
	0x0003C712,  // 00111100011100010010
	0x00044814,  // 01000100100000010100
	0x00044818,  // 01000100100000011000
	0x0003CF94,  // 00111100111110010100
	0x00004892,  // 00000100100010010010
	0x00004891,  // 00000100100010010001
	0x00038710,  // 00111000011100010000
	0x00000010,  // 00000000000000010000
	0x00000010,  // 00000000000000010000
];

alias double4 = double[3];

struct vec3 {
        union{
                double4 m;
                struct{
                        double x,y,z;
                }
        }

        this(double x, double y, double z){
                this.x = x;
                this.y = y;
                this.z = z;
        }

        this(double4 rm){
                this.m = rm;
        }

        auto opBinary(string op) (const ref vec3 r) const {
		static if (op == "+")
			return vec3(x + r.x, y + r.y, z + r.z);
		else static if (op == "^")
			return vec3(y * r.z - z * r.y, z * r.x - x * r.z, x * r.y - y * r.x);
		else static if (op == "%")
			return x * r.x + y * r.y + z * r.z;
        else static assert(0, "Operator "~op~" not implemented");

        }

       auto opBinary(string op) (vec3 r) const {
		static if (op == "+")
			return vec3(x + r.x, y + r.y, z + r.z);
		else static if (op == "^")
			return vec3(y * r.z - z * r.y, z * r.x - x * r.z, x * r.y - y * r.x);
		else static if (op == "%")
			return x * r.x + y * r.y + z * r.z;
   		else static assert(0, "Operator "~op~" not implemented");

        }


	vec3 opBinary(string op)(double r) const {
		static if (op == "*")
			return vec3(x * r, y * r, z * r);
        else static assert(0, "Operator "~op~" not implemented");
	}

	vec3 opUnary(string op)() /* op ! */ const {
		static if (op == "~")
			return this * (1 / sqrt(this % this));
        else static assert(0, "Operator "~op~" not implemented");
	}
}


void testOP() {

	auto x = vec3(1,2,3);
	auto y = vec3(4,5,6);

	vec3 z, z2;

	z = x + y;
	z = x ^ y;
	double d = x % y;
	z = x * 5;
	z = ~x;

	z2 = ~(x + y * 1e9);
}

double Random() { return uniform(0.0f, 1.0f); }


int tracer(const ref vec3 o, const ref vec3 d, ref double t, ref vec3 n) {
	t = 1e9;
	int m = 0;
	double dp = -o.z / d.z;
	if (.01 < dp){
		t = dp;
		n =  vec3(0, 0, 1);
		m = 1;
	}
	for (int k = 19; k--;)
		for (int j = 9; j--;)
			if (G[j] & 1 << k) {
				vec3 p = vec3(-k, 0, -j - 4) + o;
				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;
}

vec3 sampler(const ref vec3 o, const ref vec3 d) {
	double t;
	vec3 n;
	int m = tracer(o, d, t, n);
	if (!m){
		return vec3(.7, .6, 1) * pow(1 - d.z, 4);
	}
	vec3 h = o + d * t;
        vec3 l = ~(vec3(9 + Random(), 9 + Random(), 16) + h * -1);
        vec3 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 (cast(int) (ceil(h.x) + ceil(h.y)) & 1 ? vec3(3, 1, 1) : vec3(3, 3, 3)) * (b * .2 + .1);
	}
	return vec3(p, p, p) + sampler(h, r) * .5;
}


void renderScene() {
	writef("P6 %d %d 255 ",WIDTH,HEIGHT);
	vec3 g = ~  vec3(-6, -16, 0);
        vec3 a = ~( vec3(0, 0, 1) ^ g) * .002;
        vec3 b = ~(g ^ a) * .002;
        vec3 c = (a + b) * -256 + g;
	for (int y = HEIGHT; y--;) {
		for (int x = WIDTH; x--;) {
			auto p =  vec3(13, 13, 13);
			for (int r = 64; r--;) {
				vec3 t = a * (Random() - .5) * 99 + b * (Random() - .5) * 99;
				vec3 cam = vec3(17, 16, 8) + t;
				vec3 point = ~(t * -1 + (a * (Random() + x) + b * (y + Random()) + c) * 16);
				p = sampler(cam, point) * 3.5 + p;
			}
			writef("%c%c%c", cast(char) p.x, cast(char) p.y, cast(char) p.z);
		}
	}
}

void main() {
    //testOP();
    //return;

	auto mt = benchmark!(renderScene)(1);

	writeln("Time running(s) ", mt[0].seconds());
}


Компилятор Windows X86 64bit (x86_64-w64-mingw32)
Отсюда http://gdcproject.org/downloads

Компиляция
D:\x86_64-w64-mingw32\bin\gdc.exe -O2 -ffast-math cardrayTmpl.d

Сишный код собранный тем же компилятором с -О3 показывает то же время
7 сен 15, 02:14    [18116740]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
Изопропил
Member

Откуда:
Сообщений: 31109
Зимаргл
Так что нужно еще смотреть на получаемую картинку после оптимизации.

конечно
Зимаргл
Кстати, если в конец файла картинки .ppm дописать строчку типа "running time 100sec" то картинка не портится.

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

Откуда:
Сообщений: 13672
mayton
Коллеги. По поводу перегрузки операций и имен. Пока мы не запутались в терминах.
+ Прошу сделать рефакторинг Vector в соотвествии с этой табличкой.

C++ operationRaname to...Comment
operator+(Vector r)sum()сумма векторов
operator*(double r)prod()умножение вектора на скаляр
operator%(Vector r)sprod()скалярное произведение 2х векторов
operator^(Vector r)vprod()векторное произведение 2х векторов
operator!()norm()нормирование вектора

Переименовал.
У меня еще есть Sub(Vector), это "this + Vector * (-1)", т.е. "this - Vector". Как назвать?

По совету petalvik 18116336 сделал make.cmd для компиляции их командной строки.
Заметил интересный момент: x86 заметно быстрее чем x64. Первый 17 сек, второй 25 сек.
Надо поразбираться с ключами компилятора, или в исходнике как-то указать х86 т.к. полученный exe работает в x86 ОС как x86, в x64 ОС как x64.
Хотя exe собранный в гуе работает везде как x86.
7 сен 15, 08:11    [18116837]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 40738
Dima T
Переименовал.
У меня еще есть Sub(Vector), это "this + Vector * (-1)", т.е. "this - Vector". Как назвать?

Эээ. Не знаю. А что есть необходимость? Перформанс? Или просто рефакторинг для красоты?

По совету petalvik 18116336 сделал make.cmd для компиляции их командной строки.

Похоже твой make учитывает много вариантов конфигураций. Ну ОК. Тогда удалю свой более деревянный.
7 сен 15, 08:42    [18116874]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 40738
Коллеги. По прежнему остаётся актуален вопрос запуска бенчмарков пакетно.

Если запускать так:
$ timethis cpp/card-raytracer > card.ppm

То данные о времени попадают в card.ppm. В самый конец файла. Надо их грепать.
Для наших 6 конфигураций придётся грепать 6 бинарников. Всё это некрасиво
и пахнет безсмысленной тратой мегафлопов.
7 сен 15, 09:01    [18116927]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
Dima T
Member

Откуда:
Сообщений: 13672
mayton
Dima T
Переименовал.
У меня еще есть Sub(Vector), это "this + Vector * (-1)", т.е. "this - Vector". Как назвать?

Эээ. Не знаю. А что есть необходимость? Перформанс? Или просто рефакторинг для красоты?

Необходимость
Vector l = !(Vector(9 + Random(), 9 + Random(), 16)  + h * -1);
...
p = sampler(Vector(17, 16, 8) + t, !(t * -1 + ...

Иначе надо отдельный вектор создавать, инициализировать, умножать его на -1 затем складывать.
Так проще получается, например первая строка
            Vector l = new Vector(9 + Random(), 9 + Random(), 16);
            l.Sub(h);
            l.Norm();
7 сен 15, 09:07    [18116950]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 3 4 5 6 7 [8] 9 10 11 12 .. 43   вперед  Ctrl
Все форумы / Программирование Ответить