在一个相关的问题中,How to trap floating-point exceptions on M1 Macs?,有人想了解如何使以下代码在使用M1处理器的机器托管的macOS上本地工作:
#include <cmath> // for sqrt()
#include <csignal> // for signal()
#include <iostream>
#include <xmmintrin.h> // for _mm_setcsr
void fpe_signal_handler(int /*signal*/) {
std::cerr << "Floating point exception!\n";
exit(1);
}
void enable_floating_point_exceptions() {
_mm_setcsr(_MM_MASK_MASK & ~_MM_MASK_INVALID);
signal(SIGFPE, fpe_signal_handler);
}
int main() {
const double x{-1.0};
std::cout << sqrt(x) << "\n";
enable_floating_point_exceptions();
std::cout << sqrt(x) << "\n";
}我从另一个角度来看这个问题,并想了解为什么它不能使用Rosetta 2。
clang++ -g -std=c++17 -arch x86_64 -o fpe fpe.cpp当我运行它时,我看到以下输出:
nan
nan请注意,当我在基于Intel的Mac上做同样的事情时,我会看到以下输出:
nan
Floating point exception!有人知道罗塞塔2上是否有可能捕获浮点例外吗?
发布于 2022-09-10 02:10:17
考虑到诱捕英特尔的不同之处在于:
_mm_setcsr(_MM_MASK_MASK & ~_MM_MASK_INVALID);并利用以下方法捕捉苹果的硅:
fegetenv(&env);
env.__fpcr = env.__fpcr | __fpcr_trap_invalid;
fesetenv(&env);它似乎更有可能是Rosetta实现中的一个bug。
https://stackoverflow.com/questions/72242779
复制相似问题