我很感兴趣,如果我现在在现代C++中使用内联汇编和像GCC 4.7和VS12这样的现代编译器,我会有什么好处吗?例如,用于矢量化和一些小的优化?或者它只是淘气,现代优化编译器在任何范围内使用它都不会给我带来任何好处?
发布于 2013-03-03 07:47:50
内联程序集的使用使您的代码特定于体系结构。即使对于像vectorization
这样的东西,您现在也依赖于这样一个事实,即执行此代码的目标需要支持这些特殊/增强的指令集。
比方说,如果有人试图将你的代码从x86
移植到ARM
,他们将会遇到困难。
我建议有一种机制,通过它你可以检测目标是否支持像SSE2或SSE3这样的向量指令集,并执行你的优化代码,并在不支持增强指令集的目标上运行故障保护代码。
例如,Linux内核抽象了arch
目录下所有特定于体系结构的代码,并且有针对不同体系结构的相同功能的实现。如果您知道您的代码可能会在多个不同的体系结构上执行,那么您可以通过提出自己的抽象来做类似的事情。
发布于 2013-03-03 07:49:05
与许多事情一样,这取决于。
对于你可能要写的大多数代码来说,内联汇编不太可能有帮助。现代编译器相当智能,通常生成的代码至少与您所能编写的代码一样好。(它们生成它的速度也比您编写和调试它的速度要快得多。)
例外情况是,正如您所猜测的那样,在编写某些向量代码时例外。虽然有些编译器会尝试向量化某些循环,但他们做得并不像熟练的人类那样出色。在某些应用中(例如,DSP、视频编码等)这会产生很大的不同。但是,这需要对您正在编码的处理器有详细的了解--写得不好的矢量代码通常比编译器提供的标量代码执行得更差!
底线:除非你有很好的理由相信你需要来编写内联程序集,否则就避免这样做。
发布于 2013-03-03 07:54:46
通常,您要查找的是内部函数,这些函数对特定的指令进行了精简包装。
这可以让你在不放弃C++的类型安全性的情况下访问向量指令,同时保留与内联汇编提供的类似程度的控制。本质上,使用内部函数时,您可以选择要使用的指令,但编译器会执行寄存器分配。
https://stackoverflow.com/questions/15180739
复制相似问题