Re[18]: С# vs C++, голые цифры
От: criosray  
Дата: 20.05.09 22:39
Оценка:
Здравствуйте, IID, Вы писали:

IID>Таким образом разрыв сокращается до 361%


Да, но дотнет вариант менее оптимальный алгоритмически в виду того, что в С++ создается по одному объекту Aux на поток благодаря private(a) директиве, а в дотнет я вписал хак с созданием нового объекта на каждом из 100 итераций цикла.

У Parallel.For есть возможность использовать специальный thread local дженерик объект, но я еще не разбирался с этим. Как появится время обязательно разберусь, и отпишусь.
Re[13]: С# vs C++, голые цифры
От: Antikrot  
Дата: 20.05.09 22:42
Оценка:
Здравствуйте, criosray, Вы писали:

A>>на самом деле, что у нас есть состояние объекта "а"? всего лишь три поля .x, .y и .z. причем .z всегда 0. остается два поля, GetColor внутри себя состояние объекта не меняет, стало быть загоняем перед внешним циклом a.x и a.y в регистры до конца цикла (то есть фактически они становятся локальными для потока; а потом вообще никуда не сохраняем), и совершенно пофигу, что там будут делать другие потоки — в наши регистры они не влезут (то есть один поток не поменяет объект "a" другому, и ничего делать private тут и не надо). но это всё очень зависит от оптимизатора, сделает лишние чтение/запись в память (например, регистров не хватило) — и всё, приплыли.

C>И что, Вы запускаете и каждый раз выдает корректный результат?

а что, код при пересборке генерится одинаковый, чтения/записи из памяти для полей "a" судя по всему нет, рандома нет. так что всё нормально повторяется, кстати проверил с пришпиливанием обоих потоков к одному ядру (через KMP_AFFINITY), тоже нормально.

C>А можно экзешник где-нибудь выложить?

вот здесь — http://files.rsdn.ru/31652/test.zip
это который без private(a)
собран как icl -fast -Qopenmp -Qopenmp-link:static -MT test.cpp чтобы работать без доп. библиотек
явно требует SSE3
Re[18]: С# vs C++, голые цифры
От: MxKazan Россия  
Дата: 21.05.09 02:36
Оценка: :)))
Здравствуйте, IID, Вы писали:

IID>Таким образом разрыв сокращается до 361%

Прирожденный маркетолог! Порядок в процентах красивше А разница есть разность, следовательно НА 261% или в 3.6 раза.
Re: С# vs C++, голые цифры
От: minorlogic Украина  
Дата: 21.05.09 06:01
Оценка: +1 -1 :))) :)))
Ты не видишь очевидных вещей.

Код на шарпе пишется намного быстрее и с меньшим к-вом ошибок. Поэтому высвободившееся время можно использовать для оптимизации на более эффективных алгоритмов.
Именно поэтому когда доходит до реальных примеров, использования шарпа дает преимущество, а С++ прошлый век. И конечно твой бенчмарк выполнится быстрее в шарповом варианте или же просто бенчмарк неправильный.

Черт , или я опять где то ошибся?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[19]: С# vs C++, голые цифры
От: dr.Chaos Россия Украшения HandMade
Дата: 21.05.09 06:26
Оценка:
Здравствуйте, criosray, Вы писали:

C>Да, но дотнет вариант менее оптимальный алгоритмически в виду того, что в С++ создается по одному объекту Aux на поток благодаря private(a) директиве, а в дотнет я вписал хак с созданием нового объекта на каждом из 100 итераций цикла.


C>У Parallel.For есть возможность использовать специальный thread local дженерик объект, но я еще не разбирался с этим. Как появится время обязательно разберусь, и отпишусь.


Тут ИМХО, намного важнее то, что на C++ с OpenMP запись получилась намного декларативнее.
Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Re[19]: С# vs C++, голые цифры
От: IID Россия  
Дата: 21.05.09 06:34
Оценка: +1 :))) :)))
Здравствуйте, criosray, Вы писали:

C>Здравствуйте, IID, Вы писали:


IID>>Таким образом разрыв сокращается до 361%


C>Да, но дотнет вариант менее оптимальный алгоритмически в виду того, что в С++ создается по одному объекту Aux на поток благодаря private(a) директиве, а в дотнет я вписал хак с созданием нового объекта на каждом из 100 итераций цикла.


Создание 100 объектов разве может как-то заметно повлиять на быстродействие ? Все мы слышали песни о том как быстро работает new в дотнете.
kalsarikännit
Re[20]: С# vs C++, голые цифры
От: criosray  
Дата: 21.05.09 07:00
Оценка: -1 :)
Здравствуйте, IID, Вы писали:

IID>>>Таким образом разрыв сокращается до 361%


C>>Да, но дотнет вариант менее оптимальный алгоритмически в виду того, что в С++ создается по одному объекту Aux на поток благодаря private(a) директиве, а в дотнет я вписал хак с созданием нового объекта на каждом из 100 итераций цикла.


IID>Создание 100 объектов разве может как-то заметно повлиять на быстродействие ? Все мы слышали песни о том как быстро работает new в дотнете.


А где я писал, что это может повлиять заметно на быстродействие? Я просто сказал, что алгоритмически не оптимальный вариант. Так что не ерничайте, уважаемый.
Re[2]: С# vs C++, голые цифры
От: criosray  
Дата: 21.05.09 07:04
Оценка: 4 (2) -3
Здравствуйте, minorlogic, Вы писали:

M>Ты не видишь очевидных вещей.


M>Код на шарпе пишется намного быстрее и с меньшим к-вом ошибок. Поэтому высвободившееся время можно использовать для оптимизации на более эффективных алгоритмов.

M>Именно поэтому когда доходит до реальных примеров, использования шарпа дает преимущество, а С++ прошлый век. И конечно твой бенчмарк выполнится быстрее в шарповом варианте или же просто бенчмарк неправильный.

M>Черт , или я опять где то ошибся?


Все верно. Заметьте, что только я — дотнетчик — успел оптимизировать код. С 86 секунд до 35 секунд. С++ вариант оптимизировался просто скопировав под копирку все действия по оптимизации дотнета кода.



PS: Лопата.
Re[20]: С# vs C++, голые цифры
От: criosray  
Дата: 21.05.09 07:08
Оценка:
Здравствуйте, dr.Chaos, Вы писали:

C>>Да, но дотнет вариант менее оптимальный алгоритмически в виду того, что в С++ создается по одному объекту Aux на поток благодаря private(a) директиве, а в дотнет я вписал хак с созданием нового объекта на каждом из 100 итераций цикла.


C>>У Parallel.For есть возможность использовать специальный thread local дженерик объект, но я еще не разбирался с этим. Как появится время обязательно разберусь, и отпишусь.


DC>Тут ИМХО, намного важнее то, что на C++ с OpenMP запись получилась намного декларативнее.


Спорить не стану. OMP все-таки это постпроцессинг кода, а ParallelFx самая обычная библиотека.
Re[3]: С# vs C++, голые цифры
От: Antikrot  
Дата: 21.05.09 07:14
Оценка: +2
Здравствуйте, criosray, Вы писали:

M>>Код на шарпе пишется намного быстрее и с меньшим к-вом ошибок. Поэтому высвободившееся время можно использовать для оптимизации на более эффективных алгоритмов.

M>>Именно поэтому когда доходит до реальных примеров, использования шарпа дает преимущество, а С++ прошлый век. И конечно твой бенчмарк выполнится быстрее в шарповом варианте или же просто бенчмарк неправильный.
M>>Черт , или я опять где то ошибся?

C>Все верно. Заметьте, что только я — дотнетчик — успел оптимизировать код. С 86 секунд до 35 секунд. С++ вариант оптимизировался просто скопировав под копирку все действия по оптимизации дотнета кода.


заметьте, что тебе для этого понадобилось сделать дополнительные изменения в коде , что как-то не вяжется с "намного быстрее и с меньшим к-вом ошибок"
и потом, а зачем например было оптимизировать код, если на проце с меньшей частотой я и так получаю быстрее 35 секунд?

а вообще, неплохое обсуждение получилось
Re[4]: С# vs C++, голые цифры
От: criosray  
Дата: 21.05.09 07:20
Оценка:
Здравствуйте, Antikrot, Вы писали:

M>>>Код на шарпе пишется намного быстрее и с меньшим к-вом ошибок. Поэтому высвободившееся время можно использовать для оптимизации на более эффективных алгоритмов.

M>>>Именно поэтому когда доходит до реальных примеров, использования шарпа дает преимущество, а С++ прошлый век. И конечно твой бенчмарк выполнится быстрее в шарповом варианте или же просто бенчмарк неправильный.
M>>>Черт , или я опять где то ошибся?

C>>Все верно. Заметьте, что только я — дотнетчик — успел оптимизировать код. С 86 секунд до 35 секунд. С++ вариант оптимизировался просто скопировав под копирку все действия по оптимизации дотнета кода.


A>заметьте, что тебе для этого понадобилось сделать дополнительные изменения в коде , что как-то не вяжется с "намного быстрее и с меньшим к-вом ошибок"


Все верно. Вспомните, что изначальный код на С++ вообще не работал.

A>и потом, а зачем например было оптимизировать код, если на проце с меньшей частотой я и так получаю быстрее 35 секунд?


Ну мы исходим из предположения, что это критичный к времени исполнения участок. Доведя время выполнения дотнет кода до 35 секунд, я бы проанализировал достаточной ли стала производительность. Если нет, то переписали бы на С++ конкретно этот участок кода...
Re[5]: С# vs C++, голые цифры
От: Antikrot  
Дата: 21.05.09 07:29
Оценка:
Здравствуйте, criosray, Вы писали:

A>>заметьте, что тебе для этого понадобилось сделать дополнительные изменения в коде , что как-то не вяжется с "намного быстрее и с меньшим к-вом ошибок"

C>Все верно. Вспомните, что изначальный код на С++ вообще не работал.
и то правда

A>>и потом, а зачем например было оптимизировать код, если на проце с меньшей частотой я и так получаю быстрее 35 секунд?

C>Ну мы исходим из предположения, что это критичный к времени исполнения участок. Доведя время выполнения дотнет кода до 35 секунд, я бы проанализировал достаточной ли стала производительность. Если нет, то переписали бы на С++ конкретно этот участок кода...
... после чего можно было бы поизвращатся еще и с плюсовым кодом на предмет векторизуемости
Re[17]: С# vs C++, голые цифры
От: CreatorCray  
Дата: 21.05.09 08:51
Оценка: +1
Здравствуйте, MxKazan, Вы писали:

IID>>>>Расскажите как этот CTP включить — замеряю.

MK>>>Reference на сборки то добавил?
IID>>делаю Add Reference на проекте. На вкладке .NET громадный список сборок(?). Ничего похожего на ParallelExtensions/TPL/PLINQ там нет. ЧЯДНТ ? Желательно понятным языком расписать и по шагам.
MK>Добавляешь Reference на System.Threading.dll
MK>В коде юзаешь пространство имен System.Threading
MK>parallel extensions to .net framework 3.5

Господа, мне кажется хорошим тоном было бы простое выкладывание собранного бинаря в таких проблемных случаях.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: С# vs C++, голые цифры
От: serb Россия  
Дата: 21.05.09 09:06
Оценка: :)
а сколько бы выдала java на этом тесте?
http://files.rsdn.org/18969/writtenrussianprofessional.gif
Re[18]: С# vs C++, голые цифры
От: MxKazan Россия  
Дата: 21.05.09 09:11
Оценка: +1
Здравствуйте, CreatorCray, Вы писали:

CC>Здравствуйте, MxKazan, Вы писали:

IID>>>>>Расскажите как этот CTP включить — замеряю.
MK>>>>Reference на сборки то добавил?
IID>>>делаю Add Reference на проекте. На вкладке .NET громадный список сборок(?). Ничего похожего на ParallelExtensions/TPL/PLINQ там нет. ЧЯДНТ ? Желательно понятным языком расписать и по шагам.
MK>>Добавляешь Reference на System.Threading.dll
MK>>В коде юзаешь пространство имен System.Threading
MK>>parallel extensions to .net framework 3.5
CC>Господа, мне кажется хорошим тоном было бы простое выкладывание собранного бинаря в таких проблемных случаях.
Ай, блин, не пали нас. Вдруг у нас дотНеты как-нить разъедутся

Если серьезно, то я уже запутался в исходниках.
Было бы неплохо увидеть финальные варианты на C++ и C#, со всеми using и include.
Re[19]: С# vs C++, голые цифры
От: quagmire  
Дата: 21.05.09 10:23
Оценка: 2 (1)
Здравствуйте, MxKazan, Вы писали:

MK>Было бы неплохо увидеть финальные варианты на C++ и C#, со всеми using и include.


Сделал выдержку из предыдущих постов C# варианта. Если что поправляйте.

using System;
using System.Diagnostics;
using System.Threading;

namespace Test
{
    class Program
    {
        private const int TestCount = 100;

        static void Main(string[] args)
        {
            Parallel1();
            Parallel2();
            Serial();
            Parallel1();
            Parallel2();
            Serial();
        }

        private static void Serial()
        {
            int total = 0;
            Aux a = new Aux();
            Stopwatch watch = new Stopwatch();
            watch.Start();
            for (int i = 0; i < TestCount; i++)
            {
                for (a.y = -1.5; a.y < 1.5; a.y += 0.001)
                {
                    for (a.x = -1; a.x < 2; a.x += 0.001)
                    {
                        total += a.GetColor();
                    }
                }
            }
            watch.Stop();
            Console.WriteLine("Elapsed: {0};   b = {1}", watch.Elapsed, total);
        }

        private static void Parallel1()
        {
            int total = 0;
            Stopwatch watch = new Stopwatch();
            watch.Start();
            Parallel.For(0, TestCount, i =>
            {
                Aux a = new Aux();
                int subTotal = 0;
                for (a.y = -1.5; a.y < 1.5; a.y += 0.001)
                {
                    for (a.x = -1; a.x < 2; a.x += 0.001)
                    {
                        subTotal += a.GetColor();
                    }
                }
                Interlocked.Add(ref total, subTotal);
            });
            watch.Stop();
            Console.WriteLine("Elapsed: {0};   b = {1}", watch.Elapsed, total);
        }

        private static void Parallel2()
        {
            int total = 0;
            Stopwatch watch = new Stopwatch();
            watch.Start();
            Parallel.For(0, TestCount, () => new Aux(), (i, local) =>
            {
                Aux a = local.ThreadLocalState;
                int subTotal = 0;
                for (a.y = -1.5; a.y < 1.5; a.y += 0.001)
                {
                    for (a.x = -1; a.x < 2; a.x += 0.001)
                    {
                         subTotal += a.GetColor();
                    }
                }
                Interlocked.Add(ref total, subTotal);
            });
            watch.Stop();
            Console.WriteLine("Elapsed: {0};   b = {1}", watch.Elapsed, total);
        }

        class Aux
        {
            public double x, y, z;

            double ZZZFunc()
            {
                double xmy = x - y;
                return xmy - Math.Floor(xmy + 0.5);
            }
            double Spiral_()
            {
                double xk = x * 20;
                double a = 0.2;
                double b = 1.5;
                double y1 = y * b - a * Math.Sin(xk);
                double z1 = z * b - a * Math.Cos(xk);
                return y1 * y1 + z1 * z1;
            }
            bool Golova()
            {
                return x < 0.0 && (x * x + y * y + z * z) < 1.0 && !Shliz();
            }
            bool Spiral()
            {
                return x > 0.0 && x < 1.75 && Math.Abs(Spiral_()) < 0.5;
            }
            bool Shliz()
            {
                return x < -0.4 && y < 0.1 && y > -0.1;
            }
            bool Strokes()
            {
                return (Math.Abs(0.5 - x) < 0.02 || (x > 0.5 && Math.Abs(ZZZFunc()) < 0.005));
            }
            bool Wall()
            {
                return x > 0.5;
            }
            public int GetColor()
            {
                if (Golova()) return 1;
                if (Spiral()) return 2;
                if (Strokes()) return 3;
                if (Wall()) return 4;
                return 0;
            }
        }
    }
}
Re[2]: С# vs C++, голые цифры
От: criosray  
Дата: 21.05.09 11:18
Оценка:
Здравствуйте, serb, Вы писали:

S>а сколько бы выдала java на этом тесте?


Понеслось...
Re[3]: С# vs C++, голые цифры
От: criosray  
Дата: 21.05.09 11:20
Оценка:
Здравствуйте, criosray, Вы писали:


M>>Ты не видишь очевидных вещей.


M>>Код на шарпе пишется намного быстрее и с меньшим к-вом ошибок. Поэтому высвободившееся время можно использовать для оптимизации на более эффективных алгоритмов.

M>>Именно поэтому когда доходит до реальных примеров, использования шарпа дает преимущество, а С++ прошлый век. И конечно твой бенчмарк выполнится быстрее в шарповом варианте или же просто бенчмарк неправильный.

M>>Черт , или я опять где то ошибся?


C>Все верно. Заметьте, что только я — дотнетчик — успел оптимизировать код. С 86 секунд до 35 секунд. С++ вариант оптимизировался просто скопировав под копирку все действия по оптимизации дотнета кода.


C>


C>PS: Лопата.


Поставившим минусы внимательно перечитать выделенное. Специально для особо "понятливых" написал ведь...
Re[3]: С# vs C++, голые цифры
От: MxKazan Россия  
Дата: 21.05.09 11:32
Оценка:
Здравствуйте, criosray, Вы писали:

C>Здравствуйте, serb, Вы писали:

S>>а сколько бы выдала java на этом тесте?
C>Понеслось...
А че, и правда интересно.
Re[4]: С# vs C++, голые цифры
От: Antikrot  
Дата: 21.05.09 11:48
Оценка:
Здравствуйте, MxKazan, Вы писали:

C>>Здравствуйте, serb, Вы писали:

S>>>а сколько бы выдала java на этом тесте?
C>>Понеслось...
MK>А че, и правда интересно.
и особенно как распараллеливать будут, сравнить подход хочется
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.