Подтвердить что ты не робот

Как денормализованные поплавки обрабатываются на С#?

Просто прочитайте эту увлекательную статью о замедлениях 20x-200x, которые вы можете получить на процессорах Intel с денормализованными поплавками (числа с плавающей запятой очень близки к 0).

Существует опция с SSE, чтобы округлить их до 0, восстанавливая производительность, когда встречаются такие значения с плавающей запятой.

Как приложения С# обрабатывают это? Есть ли опция включить/отключить _MM_FLUSH_ZERO?

4b9b3361

Ответ 1

Нет такой опции.

Управляющее слово FPU в приложении С# инициализируется CLR при запуске. Изменение этого параметра не является опцией, предоставляемой инфраструктурой. Даже если вы попытаетесь изменить его, создав _control87_2(), он не будет длиться долго; любое исключение приведет к тому, что управляющее слово будет reset снова обработкой обработки исключений внутри CLR. Что было написано для решения другого аспекта управляющего слова FPU, оно позволяет разоблачить исключения с плавающей запятой. Это также будет иметь вред для любого другого управляемого кода, который не будет ожидать изменения глобального состояния.

Не имея прямого контроля над оборудованием, подразумевается ограничение при запуске кода на виртуальной машине. Не то, чтобы это тоже было легко сделать в собственном коде, библиотеки, как правило, ошибочно относятся, когда они тоже ожидают, что FPU получит инициализацию по умолчанию. В частности, проблема с флагами маскировки исключений, DLL, созданная с помощью инструментов Borland, имеет умение превращать исключения, что приводит к сбою другого кода, который не написан для обработки такого исключения. Крайне уродливая проблема для решения, контрольное слово FPU - наихудшая возможная глобальная переменная, которую вы можете себе представить.

Это накладывает на вас бремя, чтобы не позволить вашим вычислениям с плавающей точкой идти так, как это. Вычисление с денормалами почти всегда приводит к бессмысленным результатам, если не по радикально малым значениям, то, по крайней мере, от быстрой потери значительных цифр. Усечение значений менее 2.2E-308 до 0 зависит от вас. Да, не очень практично. Возможно, это нормально для того, чтобы программа доставляла бессмысленные результаты немного медленнее, чем обычно:)