Узкое место Delphi XE264bit в тригонометрических функциях DelphiTools

DelphiИнструменты.

DWS, Profiler и другие инструменты Pascal.

Delphi XE2-64bit: узкое место в тригонометрических функциях?

64-битная версия представила математику SSE2, заменив кремниевые реализации FPU программными..

Ряд Тейлора и уменьшение угла.

В 64-битной версии Delphi XE2 SSE2 используется для вычисления тригонометрических функций (cos, sin и т. Д.), И они вычисляются с помощью того, что выглядит как ряд Тейлора (литералы с двойной точностью кодируются в шестнадцатеричном формате, что, вероятно, минимизирует проблемы с точностью компилятора).

Однако ряды Тейлора работают только для малых значений, поэтому, когда у вас есть большое значение угла, оно должно быть уменьшено в диапазоне 0 … 2PI, что обычно включает форму евклидова деления с плавающей запятой или уменьшения экспоненты. Для типичных реализаций SSE2 это означает, что вычисление тригонометрической функции для большого значения угла происходит медленнее, так как это сокращение должно выполняться, как правило, вы видите что-то вроде максимума замедления на 25%..

Горлышко бутылки.

Тем не менее, здесь идет iga2iga2 (в комментариях) и Вилле Крамлинде, которые оба заметили проблемы с производительностью в Delphi XE2 64bit, особенно при столкновении с другими компиляторами. В 64-битном XE2 уменьшение выполняется с помощью цикла и уменьшения с фиксированным шагом, что означает, что чем больше значение угла, тем медленнее оно становится..

Вот несколько таймингов на тесте sin / cos (сотни тысячных звонков):

Значение угла XE2-32 XE2-64 1.0 112 мс 86 мс 100113 мс 125 мс 1e7 114 мс 3700 мс 1e14 128 мс 7600 мс.

Выбор, выбор, выбор.

Но … время — это еще не все, при вычислении тригонометрии для очень больших углов вы быстро сталкиваетесь с проблемами числовой точности, и тогда у вас в основном есть три варианта:

просто откажитесь, это фактически то, что FPU делает в 32-битном формате, например. посмотрите на значение Sin (1e22) в 32-битной версии Delphi, это… 1e22. Что явно не является допустимым значением синуса! И вы жили с этой потенциальной проблемой всю свою 32-битную жизнь … выкладываете что-нибудь, что угодно, исходя из предположения, что если пользователь пошел на такой угол, это был мусор, поэтому мусор на входе, мусор на выходе, никто не заметит это, ты не видел, чтобы я это делал … ты все равно ничего не докажешь! Постарайся быть точным, черт побери, черт возьми, черт побери, торпеды, впереди полная точность! Вот что делает XE2-64. Я не проверял в деталях, но подход XE2, похоже, основан на таком подходе: «сокращение аргументов для больших аргументов: до последнего бита», и он дает Sin (1e22) правильно.

Просто попробуйте Sin (1e22) в своей любимой среде, правильное значение -0,8522, Delphi XE2 64bit Gets It Right, где в других средах может просто мигать кучу случайных десятичных знаков, чтобы обмануть ваши глаза.

Обновление: как указал Дэниел Бартлетт в комментариях, библиотека AMD LibM обеспечивает гораздо более быструю и столь же точную реализацию sin / cos и других функций..

Итак, что дает?

Если вам нужна чистая точность, вам придется заплатить за дополнительные циклы выполнения, чтобы избежать мусора. Однако есть вероятность, что ваш код не имеет числовой точности, чтобы избежать мусора, поэтому независимо от точности сокращения вы все равно просто выбросите мусор. И если ваш код работал в 32-битном режиме, скорее всего, у вас уже был огромный мусор из-за отказа FPU.

Если вам не нужна точность, например, если вы просто используете синус / косинус для анимации на основе времени, дополнительная точность вычислений может вас укусить без всякой пользы, поэтому вам лучше выполнить сокращение самостоятельно, прежде чем вызывать sin / cos, используя любую реализацию с низкой точностью ты хочешь.

В долгосрочной перспективе для Delphi может быть предпочтительнее просто принять подход GIGO и сохранить высокоточные реализации для высокоточной математической библиотеки: в большинстве ситуаций они не будут избегать GO из-за GI, поэтому это может быть лучше сливаться с остальными (в тестах).

Похожие статьи