تمكين النقطة العائمة المقاطعات على نظام التشغيل Mac OS X إنتل
-
05-07-2019 - |
سؤال
في لينكس، feenableexcept وfedisableexcept يمكن استخدامها للسيطرة على جيل من SIGFPE المقاطعات على العائمة الاستثناءات نقطة. كيف يمكنني أن أفعل هذا على نظام التشغيل Mac OS X إنتل؟
المقاطعات وتقدموالتجميع المضمنة لتمكين النقطة العائمة في HTTP: // developer.apple.com/documentation/Performance/Conceptual/Mac_OSX_Numerics/Mac_OSX_Numerics.pdf ، ص. 7-15، ولكن فقط للباور التجمع.
المحلول
والاستثناءات لمشاريع الأعمال الصغيرة يمكن تمكين باستخدام _MM_SET_EXCEPTION_MASK
من xmmintrin.h
. على سبيل المثال، لتمكين غير صالحة (نان) استثناءات، لا
#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 الرياضيات.
ويمكنك تعطيل الرياضيات عن طريق إضافة "-mno-SSE -mno-SSE2 SSE3 -mno-" لCFLAGS الخاص بك. مرة كنت تفعل ذلك يمكنك استخدام بعض التجميع مضمنة لتكوين الاستثناءات FP الخاص بك، بالاعتماد أساسا على نفس الأعلام لينكس.
short fpflags = 0x1332 // Default FP flags, change this however you want.
asm("fnclex");
asm("fldcw _fpflags");
والصيد واحد قد تجد أن منذه مبنية OS X تماما باستخدام SSE قد يكون هناك أخطاء uncaught. أعرف أن هناك تستخدم ليكون كبير مع معالج إشارة لا يمر يعود رموز المناسبة، ولكن هذا كان قبل بضع سنوات، ونأمل أن يتم إصلاح ذلك الآن.