利用模板元编程实现解循环优化
2008-08-09 19:26:08 来源:WEB开发网所以我们再加入一个函数
void ForceCalcResult(int result) { }
强制编译器立刻计算点积。
同时,使用函数指针调用,避免编译器对该函数inline。
程序主干如下 :
int main() {
这样,编译器就屈服了,乖乖的把r1和r2的计算代码展现出来。
const int dim = 3;
int v1[dim];
int v2[dim];
void ( *const ForceCalcResult_non_inline)(int) = ForceCalcResult;
MyGenerate(v1,v1+dim,"v1");
MyGenerate(v2,v2+dim,"v2");
int r1 = dot_product(dim,v1,v2);
ForceCalcResult_non_inline(r1);
MyGenerate(v1,v1+dim,"v1");
MyGenerate(v2,v2+dim,"v2");
int r2 = dot_product<dim>(v1,v2);
ForceCalcResult_non_inline(r2);
cout<<r1<<endl;
cout<<r2<<endl;
return 0;
}//MyGenerate(v1,v1+dim,"v1");
从这4条指令,我们可以看出v1和v2的地址:
mov eax,offset string "v1" (402134h)
lea edi,[esp+24h]
lea ebx,[esp+18h]
call MyGenerate<int *> (401220h)
//MyGenerate(v2,v2+dim,"v2");
mov eax,offset string "v2" (402138h)
lea edi,[esp+18h]
lea ebx,[esp+0Ch]
call MyGenerate<int *> (401220h)v1[0]:esp+18h, v1[1]:esp+1Ch, v1[2]:esp+20h, v1[dim]:esp+24h
让我们先看模板解循环版本:
v2[0]:esp+0Ch, v2[1]:esp+10h, v2[2]:esp+14h, v2[dim]:esp+18h//int r2 = dot_product<dim>(v1,v2);
mov edi,dword ptr [esp+10h]
mov edx,dword ptr [esp+14h]
imul edi,dword ptr [esp+1Ch]
imul edx,dword ptr [esp+20h]
// edi = v2[1]*v1[1]
// edx = v2[2]*v1[2]
mov eax,dword ptr [esp+0Ch]
imul eax,dword ptr [esp+18h]
// eax = v2[0]*v1[0]
add edi,edx
add edi,eax
// edi = edi+edx+eax = v2[1]*v1[1]+v2[2]*v1[2]+v2[0]*v1[0]
循环被解开了!利用3个寄存器edi,edx,eax,最终结果应该是保存在edi中。
更多精彩
赞助商链接