Здравствуйте, IID, Вы писали:
IID>А вот это — всегда пожалуйста. Только удивительно что компилятор C# такое не осиливает, если это правда дало какой-то выигрыш.
Компиллятор не обладает интеллектом человека. Впрочем, Вы не сильно далеко ушли, раз написали это:
IID>Попытки упростить вычисления не годятся. Мы ведь можем и поменять пределы изменения пары x,y. И "упрощённый" код станет давать неверные варианты. (В суть закомментированного лень вчитываться, но этот код явно влияет на результат)
А вот Вы вчитайтесь. Может и поймете почему оптимизированный мною вариант будет давать идентичный неоптимизированному результат на любом наборе входных данных.
Здравствуйте, criosray, Вы писали:
A>>что касается a, раз ты его втащил в Parallel.For, так я его буду делать private A>>
A>>#pragma omp parallel for reduction(+:x) private(a)
A>>
A>>так он будет свой для каждого потока, и ничего лочить не надо. C>Ок, замечательно. А как в предыдущем тесте у Вас получился корректный результат без private(a)? Потрудитесь объяснить.
если нет возражений, вечером попробую объяснить (сейчас по уши в линуксе сижу)
C>А заодно приведите замеры с исправленным кодом — где добавлено private(a).
те же 18 секунд. на самом деле, разницы-то — дважды скопировать объект с тремя полями (не в циклах).
было бы еще интересно на кваде проверить опенмпишный вариант
A>>>что касается a, раз ты его втащил в Parallel.For, так я его буду делать private A>>>
A>>>#pragma omp parallel for reduction(+:x) private(a)
A>>>
A>>>так он будет свой для каждого потока, и ничего лочить не надо. C>>Ок, замечательно. А как в предыдущем тесте у Вас получился корректный результат без private(a)? Потрудитесь объяснить. A>если нет возражений, вечером попробую объяснить (сейчас по уши в линуксе сижу)
Какие могут быть возражения...
Ок, включил OMP, полную оптимизацию, поотключал всякие проверки, включил оптимизацию под SSE и т.д.
Вариант с
#pragma omp parallel for reduction(+:x) private(a)
отработал за 18 сек.
Теперь проведу те же оптимизации, что и в дотнет варианте
....
13 секунд.
Что ж, неплохо. Выявили узкое место, собрали dll`ку, подцепили ее к менеджед проекту и все пучком.
Здравствуйте, criosray, Вы писали:
C>Здравствуйте, IID, Вы писали:
IID>>А вот это — всегда пожалуйста. Только удивительно что компилятор C# такое не осиливает, если это правда дало какой-то выигрыш.
C>Компиллятор не обладает интеллектом человека.
С++ компилятор прекрасно справляется с тривиальной задачей заменить switch на if. И с переставлением вызовов местами — тоже (смотри внимательно ключи компиляции в первом посте). Так что не надо тут оправдывать убогость C# оптимизатора.
C>Впрочем, Вы не сильно далеко ушли, раз написали это:
Переход на личности и нарушение правил форума.
IID>>Попытки упростить вычисления не годятся. Мы ведь можем и поменять пределы изменения пары x,y. И "упрощённый" код станет давать неверные варианты. (В суть закомментированного лень вчитываться, но этот код явно влияет на результат)
C>А вот Вы вчитайтесь. Может и поймете почему оптимизированный мною вариант будет давать идентичный неоптимизированному результат на любом наборе входных данных.
Обязательно. Но позже. И горе тебе, если окажется что закомментированные функции влияют на результат для других диапазонов (x,y)
Здравствуйте, IID, Вы писали:
IID>Здравствуйте, criosray, Вы писали:
C>>Здравствуйте, IID, Вы писали:
IID>>>А вот это — всегда пожалуйста. Только удивительно что компилятор C# такое не осиливает, если это правда дало какой-то выигрыш.
C>>Компиллятор не обладает интеллектом человека. IID>С++ компилятор прекрасно справляется с тривиальной задачей заменить switch на if. И с переставлением вызовов местами — тоже (смотри внимательно ключи компиляции в первом посте). Так что не надо тут оправдывать убогость C# оптимизатора.
Не справляется. Ни один компилятор не догадается, что Spiral будет возвращать true значительно чаще, чем Golova.
Так что оставьте свои фантазии при себе, ок.
IID>>>Попытки упростить вычисления не годятся. Мы ведь можем и поменять пределы изменения пары x,y. И "упрощённый" код станет давать неверные варианты. (В суть закомментированного лень вчитываться, но этот код явно влияет на результат)
C>>А вот Вы вчитайтесь. Может и поймете почему оптимизированный мною вариант будет давать идентичный неоптимизированному результат на любом наборе входных данных. IID>Обязательно. Но позже. И горе тебе, если окажется что закомментированные функции влияют на результат для других диапазонов (x,y)
Горе Вам, что Вы лезете на форум и пишете всякую чушь вместо того, чтоб потратить 2 минуты и вчитаться в код.
Здравствуйте, criosray, Вы писали:
C>Не справляется. Ни один компилятор не догадается, что Spiral будет возвращать true значительно чаще, чем Golova. C>Так что оставьте свои фантазии при себе, ок.
Подсказываю: ключ /Qprof_use. В этом режиме требуется две компиляции фазы-1, в которых код иструментируется. С последующими прогонами. На основании полученных данных в фазе-2 собирается окончательный вариант.
C>>Не справляется. Ни один компилятор не догадается, что Spiral будет возвращать true значительно чаще, чем Golova. C>>Так что оставьте свои фантазии при себе, ок.
IID>Подсказываю: ключ /Qprof_use. В этом режиме требуется две компиляции фазы-1, в которых код иструментируется. С последующими прогонами. На основании полученных данных в фазе-2 собирается окончательный вариант.
Здравствуйте, criosray, Вы писали:
IID>>Подсказываю: ключ /Qprof_use. В этом режиме требуется две компиляции фазы-1, в которых код иструментируется. С последующими прогонами. На основании полученных данных в фазе-2 собирается окончательный вариант. C>Н-да. Ну проверьте. Увидите сами.
хотелось бы знать, на чем основан такой вывод. Проверяли?
Здравствуйте, IID, Вы писали:
IID>Видимо библиотечная функция кривая... ABS в представлении с плавающей точкой это всего лишь безусловный сброс старшего бита,
Это невыгодная операция. Тебе нужно из fpu перегнать переменную в cpu, а потом обратно. На этот случай есть fpu-шная версия abs.
IID>>Видимо библиотечная функция кривая... ABS в представлении с плавающей точкой это всего лишь безусловный сброс старшего бита, NBN>Это невыгодная операция. Тебе нужно из fpu перегнать переменную в cpu, а потом обратно. На этот случай есть fpu-шная версия abs.
Выгодно, не выгодно... тоже мне теоретики. Замена abs на fabs привела к увеличению времени с 11 сек до 12 сек.
Здравствуйте, IID, Вы писали:
IID>Так что не надо тут оправдывать убогость C# оптимизатора.
Смешной ты парень. В компиляторе C# вообще нету оптимизатора. Компилятор один-в-один преобразует исходник на C# в IL, так что обратный процесс вполне возможен. JIT в свою очередь не занимается такими хардкорными оптимизациями, как помилятор С++, у него времени нету.
Есдинственное что ты доказал своим постом, что оптимизаторы современных компиляторов C++ лучше JITа работают. Но это вроде и так все знают.
IID>>Так что не надо тут оправдывать убогость C# оптимизатора. G>Смешной ты парень. В компиляторе C# вообще нету оптимизатора. Компилятор один-в-один преобразует исходник на C# в IL, так что обратный процесс вполне возможен. JIT в свою очередь не занимается такими хардкорными оптимизациями, как помилятор С++, у него времени нету.
G>Есдинственное что ты доказал своим постом, что оптимизаторы современных компиляторов C++ лучше JITа работают. Но это вроде и так все знают.
Да и к тому же там, где программа на С# заработает без перекомпиляции, программа на С++, собранная с использованием инструкций SSE3, например, попросту не заведется на более старых процессорах.
Здравствуйте, criosray, Вы писали:
C>Да и к тому же там, где программа на С# заработает без перекомпиляции, программа на С++, собранная с использованием инструкций SSE3, например, попросту не заведется на более старых процессорах.
ну это как собрать... можно например с /QaxSSE3 (для icl), всё заведется
Здравствуйте, criosray, Вы писали:
IID>>>Видимо библиотечная функция кривая... ABS в представлении с плавающей точкой это всего лишь безусловный сброс старшего бита, NBN>>Это невыгодная операция. Тебе нужно из fpu перегнать переменную в cpu, а потом обратно. На этот случай есть fpu-шная версия abs.
C>Выгодно, не выгодно... тоже мне теоретики. Замена abs на fabs привела к увеличению времени с 11 сек до 12 сек.
Ты не понимаешь о чём говоришь Сначала попробовал бы посмотреть дизасм
Я молчу про измерение времени выполнения этого теста в секундах! И уж тем более однократное.
Здравствуйте, IID, Вы писали:
C>>Н-да. Ну проверьте. Увидите сами.
IID>Читайте доки, они рулез. (тыкаю пальцем: Profile-Guided Optimization)
Месье — теоретик? Доки эти я читал за долго до того, как Вы программированием занялись. И знаю всяко лучше Вашего, что этой оптимизации компиллятор не сделает. Не верите — проверьте и убедитесь.
IID>>>>Видимо библиотечная функция кривая... ABS в представлении с плавающей точкой это всего лишь безусловный сброс старшего бита, NBN>>>Это невыгодная операция. Тебе нужно из fpu перегнать переменную в cpu, а потом обратно. На этот случай есть fpu-шная версия abs.
C>>Выгодно, не выгодно... тоже мне теоретики. Замена abs на fabs привела к увеличению времени с 11 сек до 12 сек.
NBN>Ты не понимаешь о чём говоришь Сначала попробовал бы посмотреть дизасм NBN>Я молчу про измерение времени выполнения этого теста в секундах! И уж тем более однократное.
Что мне смотреть дизассемблером, если я вижу, что время выполнения ухудшилась?
Вам и господину IID надо поменьше заниматься теорией и по больше практикой, чтоб не писать такой чуши.