Windows下生成DLL時,直接使用內聯彙編的宏融合(Macro Fusion)模式,可以提高效率,如
__asm {
movdqa xmm0, g_data0;
paddw xmm0, g_data1;
movdqa g_data2, xmm0;
}
這裏的g_data0|g_data1|g_data2都是全局變量。
類似的代碼,移植到Linux時,會遇到SIGSEGV問題,原因如下:
Linux下生成so庫時,需要使用-fPIC編譯選項,但PIC即位置無關代碼卻與Windows的Relocatable即可重定位表是衝突的。
Linux下如此修改則可:
__asm {
lea eax, g_data0;
mov eax, [eax];
movdqa xmm0, [eax];
lea eax, g_data1;
mov eax, [eax];
movdqa xmm1, [eax];
paddw xmm0, xmm1;
lea eax, g_data0;
mov eax, [eax];
movdqa [eax], xmm0;
}
可見PIC模式會導致代碼量增加,效率變慢,但其主要優勢在於代碼可以多進程共享的情況下佔用更少的空間。
一鍵加速網絡訪問Google、Facebook:
http://my.yizhihongxing.com/aff.php?aff=343