c++内联程序集优化
c++ inline assembly optimizations
为什么Visual Studio C++编译器默认情况下不优化以下代码?
#include "ctime"
#include "iostream"
#define BIG_NUM 10000000000
int main() {
std::clock_t begin = clock();
for (unsigned long long i = 0; i < BIG_NUM; ++i) {
__asm
{
nop
}
}
std::clock_t end = clock();
std::cout << "time: " << double(end - begin) / CLOCKS_PER_SEC;
std::cin.get();
}
如果没有_asm
块,操作时间始终为0,因为完全由于编译器优化,循环被"跳过"。对于_asm
块,它需要几秒钟的时间。
是否有任何编译器标志来优化内联程序集,或者由于某些不明确的原因而无法实现?
编译器并不真正理解内联汇编,因此认为它可以做任何事情。
通常,当您特别希望在低级别优化某些代码时,会使用内联程序集。如果你正在这样做,为什么你希望编译器进一步优化它?
向已接受的答案添加更多信息
1) 有一些编译器可以跨内联asm进行优化-Xbox 360编译器可以,但这些可能是例外,而不是规则。
2) 有一些工具可以在编译的二进制文件上运行优化,例如这里-这些工具可能能够优化内联asm。
3) 最后,也许也是最恰当的一点,添加内联asm最流行的原因之一是手动滚动数学量大的矢量化SIMD例程,这些例程对于编译器来说太复杂了,无法单独完成。如果你想要这个,那么一个更好的方法是使用内部函数。本质让你两全其美-你可以手动滚动你棘手的例程,然后让编译器为你处理寄存器分配、展开、交织、死代码修剪等。
关于内部函数的一个好例子,请参阅下面的例子-如果定义了"INLINE_SM",它需要大约300ms,否则它会被优化为零,并且需要0ms,即使它们做了类似的事情。
#include <windows.h>
#include <iostream>
int main()
{
auto tc = ::GetTickCount();
for(int i=0; i<1024 * 1024 * 1024; ++i)
{
#if INLINE_ASM
_asm
{
paddw xmm0, xmm0;
}
#else
_mm_add_epi16(__m128i(), __m128i());
#endif
}
std::cout << "Took " << ::GetTickCount()-tc << " milli-seconds!" << std::endl;
}
相关文章:
- 内联程序集printf将整数解释为地址
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 具有外部"c"和程序集的未定义函数
- 用于将C++代码转换为 Web 程序集的脚本未终止
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- CoreCLR 中的检测探查器 - 将帮助程序程序集加载到 dotnet 进程的方法
- 不同于按值传递和常量引用传递的程序集
- 为什么在堆栈和堆上创建变量会产生相同的程序集代码?
- C++变量在调用 x64 程序集函数后重置为 0
- 如何将C++子例程链接到 x86 程序集程序?
- Qt 网页程序集缓存
- 测试操作系统时执行程序集"sti"时虚拟框崩溃
- 为什么从 constexpr 引用生成的程序集代码与从 constexpr 指针生成的程序集代码不同?
- 将内联程序集尾调用函数尾声替换为用于x86/x64 msvc的Intrinsics
- 解析 C# 中的C++程序集
- Arm GNU编译器:通过多余的强制转换优化的三进制生成的程序集
- 对 constexpr 与内联函数的调用编译为不同的程序集,并禁用优化
- 通过ARM NEON程序集最大限度地优化元素乘法
- 优化器如何优化c++或程序集
- c++内联程序集优化