Вопрос

В Linux feenableexcept и fedisableexcept можно использовать для управления генерацией прерываний SIGFPE при исключениях с плавающей запятой.Как я могу это сделать на Mac OS X Intel?

Встроенная сборка для включения прерываний с плавающей запятой предусмотрена в http://developer.apple.com/documentation/Performance/Conceptual/Mac_OSX_Numerics/Mac_OSX_Numerics.pdf, стр.7-15, но только для сборки PowerPC.

Это было полезно?

Решение

Исключения для sse можно включить с помощью _MM_SET_EXCEPTION_MASK От xmmintrin.h.Например, чтобы включить недопустимые исключения (nan), выполните

#include <xmmintrin.h>
...
_MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~_MM_MASK_INVALID);

Другие советы

В Mac OS X это умеренно сложно.OS X по умолчанию использует единицу SSE для всей математики FP, а не единицу x87 FP.Модуль SSE не поддерживает параметры прерывания, так что это означает, что в дополнение к разрешению прерываний вам нужно убедиться, что весь ваш код скомпилирован так, чтобы не использовать SSE math.

Вы можете отключить математику, добавив "-mno-sse -mno-sse2 -mno-sse3" в свои CFLAGS.Как только вы это сделаете, вы можете использовать какую-нибудь встроенную сборку для настройки ваших исключений FP, в основном с теми же флагами, что и в Linux.

short fpflags = 0x1332 // Default FP flags, change this however you want. 
asm("fnclex");
asm("fldcw _fpflags");

Единственная загвоздка, которую вы можете обнаружить, заключается в том, что, поскольку OS X полностью построена с использованием sse, могут быть не обнаруженные ошибки.Я знаю, что раньше была проблема, когда обработчик сигналов не передавал обратно нужные коды, но это было несколько лет назад, надеюсь, сейчас это исправлено.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top