Автор Тема: Мы победили :-)  (Прочитано 35440 раз)

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Мы победили :-)
« Ответ #75 : Апрель 24, 2013, 01:14:41 pm »
for (int x = 1; x < W - 1; x++)
...
(*(pa + (H * (y - 1) + x) * 3
А вынос множителя за скобки прироста в производительности не даёт?

for (int x = 1; x < W * 3 - 3; x = x + 3)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Мы победили :-)
« Ответ #76 : Апрель 24, 2013, 01:22:14 pm »
В OpenBSD есть утилита APM. В линуксе подобного нет? Можно жёстко выставить минимальные частоты проца. Это должно повысить качество результата тестов.
В данном проекте целевая платформа - Windows. Соответственно компилятор/среда разработки - MSVS 2012.

Кроме того, жестко фиксировать - это слишком жестоко для ультрабука. Например как эта APM себя поведет с интеловской технологией Turbo Boost?

Ну и учти, что у нас тут первичны не тесты, а то как оно будет работать у пользователя. А у пользователя оно будет работать долго, постоянно и без фиксации частоты.

Кстати, 45 fps это конечно хорошо, но для продукта (а не прототипа) нам нужно еще повысить производительность этого эффекта как минимум в 8-10 раз. Причем эффект должен еще стать визуально красивее. И да, распараллеливать на несколько ядер CPU нельзя. Все должно пахать в одном потоке.
Y = λf.(λx.f (x x)) (λx.f (x x))

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Мы победили :-)
« Ответ #77 : Апрель 24, 2013, 01:25:12 pm »
И вообще, можно же держать три указателя на три строки. Чтобы вычислять их однократно. И даже вычислять-то одну надо, остальные от неё на константу отличаются. Неужели то, что приведено в исходниках оптимизируется лучше, чем ручной вывод?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Мы победили :-)
« Ответ #78 : Апрель 24, 2013, 01:31:22 pm »
И вообще, можно же держать три указателя на три строки. Чтобы вычислять их однократно. И даже вычислять-то одну надо, остальные от неё на константу отличаются. Неужели то, что приведено в исходниках оптимизируется лучше, чем ручной вывод?
Ты про какой из двух алгоритмов говоришь? Ну, и вообще, show me code :-) Проверим.
Y = λf.(λx.f (x x)) (λx.f (x x))

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Мы победили :-)
« Ответ #79 : Апрель 24, 2013, 01:37:00 pm »
В данном проекте целевая платформа - Windows.
На винде аналог точно есть.

Ну и учти, что у нас тут первичны не тесты, а то как оно будет работать у пользователя. А у пользователя оно будет работать долго, постоянно и без фиксации частоты.
То есть, вы будете приходить к каждому пользователю и проверять, что у них работает как надо? Как вы убедитесь, что оно работает быстро, если на частоту не обращаете внимание и не хотите знать производительности при минимальном задействовании процессора?

Если поставить минимальную частоту на проц, то, во-первых, будет известно, что при такой нагрузке он гарантированно не работает или наоборот - работает даже тогда. А во-вторых, будет известно, что полученные результаты верны, потому что частота проца не скакала.

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Мы победили :-)
« Ответ #80 : Апрель 24, 2013, 01:38:00 pm »
я про исходник на шарпе

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Мы победили :-)
« Ответ #81 : Апрель 24, 2013, 01:40:35 pm »
я про исходник на шарпе
Попробуй его модифицировать в соответствии со своим пониманием. Я прогоню тест.
Y = λf.(λx.f (x x)) (λx.f (x x))

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Мы победили :-)
« Ответ #82 : Апрель 24, 2013, 02:19:38 pm »
Ой, а там H. Я, наверно, неправильно понял алгоритм.

*(pa + (H * (y + 1) + x) * 3 + color_shift)

Здесь должен быть H?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Мы победили :-)
« Ответ #83 : Апрель 24, 2013, 02:24:09 pm »
Ой, а там H. Я, наверно, неправильно понял алгоритм.

*(pa + (H * (y + 1) + x) * 3 + color_shift)

Здесь должен быть H?
Нет, видимо должен быть W. Косячок.
Y = λf.(λx.f (x x)) (λx.f (x x))

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Мы победили :-)
« Ответ #84 : Апрель 24, 2013, 03:30:12 pm »
Вот как-то так. Но я не пишу на шарпе, поэтому мог сильно ошибиться. Да и вообще - фортранщики ликуют. Но всё же - как насчёт производительности?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication5
{
    class Program
    {
        static unsafe void Main(string[] args)
        {
            const int H = 480;
            const int W = 640;
            byte[] a = new byte[H * W * 3];
            byte[] b = new byte[H * W * 3];
            byte* pa0, pa1, pa2f, pa2l, pa3, pb0, pb1, pb2f, pb2l, pb3;
            int w = W * 3;

            System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
            const int N = 13;
            timer.Reset();
            timer.Start();
            const int frames = 1000;
            for (int nn = 0; nn<frames; nn++)
            {
                fixed (byte* pa = &a[0])
                {
                    fixed (byte* pb = &b[0])
                    {
                        for (int n = 0; n < N; n++)
                        {
pb0 = pb + w + 3; // другой массив
pa1 = pa + 3; // первый массив. первая строка
pa2f = pa + w; // первый массив. вторая строка
pa2l = pa1 + w + 3; // первый массив. вторая строка
pa3 = pa2 + w; // первый массив. третья строка
                            for (int y = 1; y < H - 1; y++)
                            {
                                for (int x = 1; x < w - 3; x = x + 3)
                                {
                                    for (int color_shift = 0; color_shift < 3; color_shift++)
                                    {
                                        *pb0 = (byte)(0.25 * (*pa1
                                        + *pa3
                                        + *pa2f
                                        + *pa2l));
pb0 = pb0 + 1;
pa1 = pa1 + 1;
pa2f = pa2f + 1;
pa2l = pa2l + 1;
pa3 = pa3 + 1;
                                    }
                                }
pb1 = pb1 + 6;
pa1 = pa1 + 6;
pa2f = pa2f + 6;
pa2l = pa2l + 6;
pa3 = pa3 + 6;
                            }
pa0 = pa + w + 3;
pb1 = pb + 3;
pb2f = pb + w;
pb2l = pb1 + w + 3;
pb3 = pb2 + w;
                            for (int y = 1; y < H - 1; y++)
                            {
                                for (int x = 1; x < w - 3; x++)
                                {
                                    for (int color_shift = 0; color_shift < 3; color_shift++)
                                    {
                                        *pa0 = (byte)(0.25 * (*pb1
                                            + *pb3
                                            + *pb2f
                                            + *pb2l));
pa0 = pa0 + 1;
pb1 = pb1 + 1;
pb2f = pb2f + 1;
pb2l = pb2l + 1;
pb3 = pb3 + 1;
                                    }
                                }
pa0 = pa0 + 6;
pb1 = pb1 + 6;
pb2f = pb2f + 6;
pb2l = pb2l + 6;
pb3 = pb3 + 6;
                            }
                        }
                    }
                }
            }

            timer.Stop();
            double dt = timer.Elapsed.TotalSeconds;
            System.Console.WriteLine("N = {0} (R = {1}), dt={2} seconds, FPS = {3}",
                N, 2 * N, dt, (frames / dt));

            System.Console.ReadLine();
        }
    }
}
« Последнее редактирование: Апрель 24, 2013, 03:33:33 pm от Valery Solovey »

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Мы победили :-)
« Ответ #85 : Апрель 24, 2013, 06:59:29 pm »
Также N я фиксировал (N=13)
А ты точно фиксировал N=13, а не R=13? В моём алгоритме за один присест делается два прогона, так что моё N=13 соответствует радиусу размытия R=26.

Для R=13 у меня для double-сов будет что-то среднее между:

N = 6 (R = 12), dt=0.006789 seconds, FPS = 147 (RGB FPS = 49)
N = 7 (R = 14), dt=0.0080567 seconds, FPS = 124 (RGB FPS = 41)

Твой алгоритм я чего-то не понял, наработался за день голова сейчас уже не варит...

Здесь должен быть H?
Нет, видимо должен быть W. Косячок.
Ага, у меня косяк, надо умножать на W.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Мы победили :-)
« Ответ #86 : Апрель 24, 2013, 07:09:40 pm »
Также N я фиксировал (N=13)
А ты точно фиксировал N=13, а не R=13? В моём алгоритме за один присест делается два прогона, так что моё N=13 соответствует радиусу размытия R=26.

Для R=13 у меня для double-сов будет что-то среднее между:

N = 6 (R = 12), dt=0.006789 seconds, FPS = 147 (RGB FPS = 49)
N = 7 (R = 14), dt=0.0080567 seconds, FPS = 124 (RGB FPS = 41)
Да, вполне вероятно я ошибся. Впрочем, думаю завтра-или в пятницу я доберусь до уже визуализации, и будем сравнивать уже визуальные результаты :-) Там будет видно кто кому где эквивалентен.
Y = λf.(λx.f (x x)) (λx.f (x x))

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Мы победили :-)
« Ответ #87 : Апрель 24, 2013, 10:33:03 pm »
Сабж! Вот в этом конкурсе: http://hackday.ru/events/hackday-25/custom
Мой проект - 24ый тут: http://hackday.ru/events/hackday-25/projects
Кстати, для полноты результата не забудьте потом сделать второй плагин, который на стороне клиента в реальном времени будет восстанавливать изображение. За специальную плату...

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Мы победили :-)
« Ответ #88 : Апрель 24, 2013, 10:47:08 pm »
Сабж! Вот в этом конкурсе: http://hackday.ru/events/hackday-25/custom
Мой проект - 24ый тут: http://hackday.ru/events/hackday-25/projects
Кстати, для полноты результата не забудьте потом сделать второй плагин, который на стороне клиента в реальном времени будет восстанавливать изображение. За специальную плату...
После того как оно пройдет через h264, уже ничего не восстановить. Но если без кодека - то да, возможно :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Мы победили :-)
« Ответ #89 : Май 07, 2013, 09:32:53 am »
Сегодня прилетело официальное оповещении о начале второй фазы большого Интеловского конкурса: https://perceptualchallenge.intel.com/

Цитировать
Intel wants to see your most innovative and unique games, productivity tools, user interfaces, or other innovative use of gesture, voice control, facial recognition, and augmented reality. The second phase of Intel’s Perceptual Computing Challenge is NOW OPEN FOR ENTRIES and with a grand-prize of $100,000 USD and thousands of dollars in even more prizing available in 4 different categories, this is not one to miss.

Цитировать
We invite you to submit your idea within the next six weeks. Idea submissions are due June 17th.  The creators with the most innovative and impressive concepts will receive an interactive gesture camera in order to turn their idea into reality and will have until August to develop and deliver their demos.

Intel is also looking for developers and applications using this technology to showcase at industry events and market together with our new computing platforms.

Правила и описание: https://perceptualchallenge.intel.com/static/docs/terms_and_conditions.pdf

Победителей первой фазы этого большого конкурсе Интел можно глянуть тут:
http://software.intel.com/sites/campaigns/perceptualshowcase/
Y = λf.(λx.f (x x)) (λx.f (x x))