所以我们想使用启用运行时 CPU 调度的 Intel C 编译器(这是在 Windows 平台上)。我们使用选项/arch:IA32加上/QaxSSE2,但没有 /QxFoo选项。根据我们的理解,这应该生成一个在任何IA32 (x86) 处理器上运行的二进制文件,但仍然在实际支持 SSE2 指令集的处理器上使用 SSE2 优化的代码路径。
然而,测试表明在不支持 SSE2 的处理器(例如 Pentium III)上,二进制文件会因“非法指令”异常而崩溃!有趣的是,仅删除 /QaxSSE2并保留其他任何内容,生成的二进制文件在没有SSE2 支持的处理器上运行良好。
另一个有趣的观察是:使用/arch:IA32加上/QaxSSE2 和 /Ob0(禁用内联!)生成的二进制文件在没有SSE2 支持的处理器上也可以正常工作。
此时,无论/arch:IA32选项如何,似乎任一运行时 CPU 调度都会提高 SSE2 的“基本”代码路径的 CPU 要求。或者该函数内联和运行时 CPU 调度不能一起使用。但是我们在英特尔文档中找不到任何提及这一点。这是非常重要的信息,所以我们认为这需要在文档中提及!
任何人都可以确认观察或澄清发生了什么吗?
谢谢!