Здравствуйте, IID, Вы писали:
IID>Таким образом разрыв сокращается до 361%
Да, но дотнет вариант менее оптимальный алгоритмически в виду того, что в С++ создается по одному объекту Aux на поток благодаря private(a) директиве, а в дотнет я вписал хак с созданием нового объекта на каждом из 100 итераций цикла.
У Parallel.For есть возможность использовать специальный thread local дженерик объект, но я еще не разбирался с этим. Как появится время обязательно разберусь, и отпишусь.
Здравствуйте, 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
Здравствуйте, IID, Вы писали:
IID>Таким образом разрыв сокращается до 361%
Прирожденный маркетолог! Порядок в процентах красивше А разница есть разность, следовательно НА 261% или в 3.6 раза.
Код на шарпе пишется намного быстрее и с меньшим к-вом ошибок. Поэтому высвободившееся время можно использовать для оптимизации на более эффективных алгоритмов.
Именно поэтому когда доходит до реальных примеров, использования шарпа дает преимущество, а С++ прошлый век. И конечно твой бенчмарк выполнится быстрее в шарповом варианте или же просто бенчмарк неправильный.
Здравствуйте, criosray, Вы писали:
C>Да, но дотнет вариант менее оптимальный алгоритмически в виду того, что в С++ создается по одному объекту Aux на поток благодаря private(a) директиве, а в дотнет я вписал хак с созданием нового объекта на каждом из 100 итераций цикла.
C>У Parallel.For есть возможность использовать специальный thread local дженерик объект, но я еще не разбирался с этим. Как появится время обязательно разберусь, и отпишусь.
Тут ИМХО, намного важнее то, что на C++ с OpenMP запись получилась намного декларативнее.
Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Здравствуйте, criosray, Вы писали:
C>Здравствуйте, IID, Вы писали:
IID>>Таким образом разрыв сокращается до 361%
C>Да, но дотнет вариант менее оптимальный алгоритмически в виду того, что в С++ создается по одному объекту Aux на поток благодаря private(a) директиве, а в дотнет я вписал хак с созданием нового объекта на каждом из 100 итераций цикла.
Создание 100 объектов разве может как-то заметно повлиять на быстродействие ? Все мы слышали песни о том как быстро работает new в дотнете.
Здравствуйте, IID, Вы писали:
IID>>>Таким образом разрыв сокращается до 361%
C>>Да, но дотнет вариант менее оптимальный алгоритмически в виду того, что в С++ создается по одному объекту Aux на поток благодаря private(a) директиве, а в дотнет я вписал хак с созданием нового объекта на каждом из 100 итераций цикла.
IID>Создание 100 объектов разве может как-то заметно повлиять на быстродействие ? Все мы слышали песни о том как быстро работает new в дотнете.
А где я писал, что это может повлиять заметно на быстродействие? Я просто сказал, что алгоритмически не оптимальный вариант. Так что не ерничайте, уважаемый.
Здравствуйте, minorlogic, Вы писали:
M>Ты не видишь очевидных вещей.
M>Код на шарпе пишется намного быстрее и с меньшим к-вом ошибок. Поэтому высвободившееся время можно использовать для оптимизации на более эффективных алгоритмов. M>Именно поэтому когда доходит до реальных примеров, использования шарпа дает преимущество, а С++ прошлый век. И конечно твой бенчмарк выполнится быстрее в шарповом варианте или же просто бенчмарк неправильный.
M>Черт , или я опять где то ошибся?
Все верно. Заметьте, что только я — дотнетчик — успел оптимизировать код. С 86 секунд до 35 секунд. С++ вариант оптимизировался просто скопировав под копирку все действия по оптимизации дотнета кода.
Здравствуйте, dr.Chaos, Вы писали:
C>>Да, но дотнет вариант менее оптимальный алгоритмически в виду того, что в С++ создается по одному объекту Aux на поток благодаря private(a) директиве, а в дотнет я вписал хак с созданием нового объекта на каждом из 100 итераций цикла.
C>>У Parallel.For есть возможность использовать специальный thread local дженерик объект, но я еще не разбирался с этим. Как появится время обязательно разберусь, и отпишусь.
DC>Тут ИМХО, намного важнее то, что на C++ с OpenMP запись получилась намного декларативнее.
Спорить не стану. OMP все-таки это постпроцессинг кода, а ParallelFx самая обычная библиотека.
Здравствуйте, criosray, Вы писали:
M>>Код на шарпе пишется намного быстрее и с меньшим к-вом ошибок. Поэтому высвободившееся время можно использовать для оптимизации на более эффективных алгоритмов. M>>Именно поэтому когда доходит до реальных примеров, использования шарпа дает преимущество, а С++ прошлый век. И конечно твой бенчмарк выполнится быстрее в шарповом варианте или же просто бенчмарк неправильный. M>>Черт , или я опять где то ошибся?
C>Все верно. Заметьте, что только я — дотнетчик — успел оптимизировать код. С 86 секунд до 35 секунд. С++ вариант оптимизировался просто скопировав под копирку все действия по оптимизации дотнета кода.
заметьте, что тебе для этого понадобилось сделать дополнительные изменения в коде , что как-то не вяжется с "намного быстрее и с меньшим к-вом ошибок"
и потом, а зачем например было оптимизировать код, если на проце с меньшей частотой я и так получаю быстрее 35 секунд?
Здравствуйте, Antikrot, Вы писали:
M>>>Код на шарпе пишется намного быстрее и с меньшим к-вом ошибок. Поэтому высвободившееся время можно использовать для оптимизации на более эффективных алгоритмов. M>>>Именно поэтому когда доходит до реальных примеров, использования шарпа дает преимущество, а С++ прошлый век. И конечно твой бенчмарк выполнится быстрее в шарповом варианте или же просто бенчмарк неправильный. M>>>Черт , или я опять где то ошибся?
C>>Все верно. Заметьте, что только я — дотнетчик — успел оптимизировать код. С 86 секунд до 35 секунд. С++ вариант оптимизировался просто скопировав под копирку все действия по оптимизации дотнета кода.
A>заметьте, что тебе для этого понадобилось сделать дополнительные изменения в коде , что как-то не вяжется с "намного быстрее и с меньшим к-вом ошибок"
Все верно. Вспомните, что изначальный код на С++ вообще не работал.
A>и потом, а зачем например было оптимизировать код, если на проце с меньшей частотой я и так получаю быстрее 35 секунд?
Ну мы исходим из предположения, что это критичный к времени исполнения участок. Доведя время выполнения дотнет кода до 35 секунд, я бы проанализировал достаточной ли стала производительность. Если нет, то переписали бы на С++ конкретно этот участок кода...
Здравствуйте, criosray, Вы писали:
A>>заметьте, что тебе для этого понадобилось сделать дополнительные изменения в коде , что как-то не вяжется с "намного быстрее и с меньшим к-вом ошибок" C>Все верно. Вспомните, что изначальный код на С++ вообще не работал.
и то правда
A>>и потом, а зачем например было оптимизировать код, если на проце с меньшей частотой я и так получаю быстрее 35 секунд? C>Ну мы исходим из предположения, что это критичный к времени исполнения участок. Доведя время выполнения дотнет кода до 35 секунд, я бы проанализировал достаточной ли стала производительность. Если нет, то переписали бы на С++ конкретно этот участок кода...
... после чего можно было бы поизвращатся еще и с плюсовым кодом на предмет векторизуемости
Здравствуйте, 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
Господа, мне кажется хорошим тоном было бы простое выкладывание собранного бинаря в таких проблемных случаях.
Здравствуйте, 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.
M>>Ты не видишь очевидных вещей.
M>>Код на шарпе пишется намного быстрее и с меньшим к-вом ошибок. Поэтому высвободившееся время можно использовать для оптимизации на более эффективных алгоритмов. M>>Именно поэтому когда доходит до реальных примеров, использования шарпа дает преимущество, а С++ прошлый век. И конечно твой бенчмарк выполнится быстрее в шарповом варианте или же просто бенчмарк неправильный.
M>>Черт , или я опять где то ошибся?
C>Все верно. Заметьте, что только я — дотнетчик — успел оптимизировать код. С 86 секунд до 35 секунд. С++ вариант оптимизировался просто скопировав под копирку все действия по оптимизации дотнета кода.
C>
C>PS: Лопата.
Поставившим минусы внимательно перечитать выделенное. Специально для особо "понятливых" написал ведь...
Здравствуйте, criosray, Вы писали:
C>Здравствуйте, serb, Вы писали: S>>а сколько бы выдала java на этом тесте? C>Понеслось...
А че, и правда интересно.
Здравствуйте, MxKazan, Вы писали:
C>>Здравствуйте, serb, Вы писали: S>>>а сколько бы выдала java на этом тесте? C>>Понеслось... MK>А че, и правда интересно.
и особенно как распараллеливать будут, сравнить подход хочется