تمكين النقطة العائمة المقاطعات على نظام التشغيل Mac OS X إنتل

StackOverflow https://stackoverflow.com/questions/247053

سؤال

في لينكس، 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. أعرف أن هناك تستخدم ليكون كبير مع معالج إشارة لا يمر يعود رموز المناسبة، ولكن هذا كان قبل بضع سنوات، ونأمل أن يتم إصلاح ذلك الآن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top