汇编优化问题,谁能给段优化算法加分200

AthlonxpX86 2003-09-15 12:54:03
准备写SSE汇编算法优化,可以刚开始就遇到问题了

下面这段C代码
QueryPerformanceCounter((LARGE_INTEGER*)&start_time);

QueryPerformanceCounter((LARGE_INTEGER*)&end_time);
cout<<"time is : "<<double(end_time-start_time)<<"\n" ;
用此方法测的基本时间是4

cout<<"time is : "<<double(end_time-start_time)<<"\n" ;


QueryPerformanceCounter((LARGE_INTEGER*)&start_time);
for(z=0;z<MAXZ;z++)
for(i=0;i<MAX;i++){

}

QueryPerformanceCounter((LARGE_INTEGER*)&end_time);
cout<<"time is : "<<double(end_time-start_time)<<"\n" ;
测得使用时间是4,说明
for(z=0;z<MAXZ;z++)
for(i=0;i<MAX;i++)
{
}
使用时间约等于0

我用VC内联汇编
void __stdcall SSE(TEMP* dest, TEMP *sou, int max,int maxz)
{
//空函数花费时间约等于0

__asm
{

mov edi, dest
mov esi, sou
mov ebx, maxz
mov edx, max //以上参数传递花费时间2
mov eax, 0 //i=0
a: cmp eax, ebx //以下是上面C语言中的for循环.使用时间10-11真夸张
jb b
jmp end
b: mov ecx, 0 //z=0
c: cmp ecx, edx
jb d //去SSE加速代码
inc eax
jmp a
d:



inc ecx
jmp c
end: nop
}

return ;

}

QueryPerformanceCounter((LARGE_INTEGER*)&start_time);

SSE(mytmp2,mytmp,MAX,MAXZ);
QueryPerformanceCounter((LARGE_INTEGER*)&end_time);
cout<<"time is : "<<double(end_time-start_time)<<"\n" ;
测得时间是17,晕死,本想用汇编优化结果越搞越慢
...全文
55 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ahjoe 2003-09-16
  • 打赏
  • 举报
回复
for(z=0;z<MAXZ;z++)
for(i=0;i<MAX;i++)
{
}
对于聪明的编译器,优化后这段源代码不产生任何机器码。
AthlonxpX86 2003-09-16
  • 打赏
  • 举报
回复
解决散分,
找到原因,这主要和编译器优化有关,
像下面这段release版的代码,编译器会自动去掉,而不编译,如果在循环中加入程序中要处理的任务,就会被编译,看了他编译的代码,访存操作多一些,所以还是使用高效的汇编快
; 88 : for(z=0;z<MAXZ;z++)
; 89 : for(i=0;i<MAX;i++){
; 90 : ++k;
; 91 : // if(mytmp[i].z==z)
; 92 : // mytmp2[j++].ID=mytmp[i].ID;
; 93 : }


用汇编效率还是高一些
W32API 2003-09-16
  • 打赏
  • 举报
回复
是的。
CPU 的执行流程是按照 INTEL 的规范来的,不可能说 C 本身不需遵守。
只要不是设计上的问题,循环本身的差别不大。。。
W32API 2003-09-15
  • 打赏
  • 举报
回复
你的意思是用汇编写的循环判断去替代 C 的 FOR 循环??
masterz 2003-09-15
  • 打赏
  • 举报
回复
计时用RDTSC命令精确一些
按照下面的设置,可以让VC产生asm 代码
Project->Settings...

C/C++ tab

Category: Choose Listing Files

Listing file type:

select "Assembly with source code"
csdsjkk 2003-09-15
  • 打赏
  • 举报
回复
mov eax,0
a:
cmp eax,ebx
jae end
mov ecx,0
c:
cmp ecx,edx
jae d
inc ecx
jmp c
d:
inc eax
jmp a

end:




W32API 2003-09-15
  • 打赏
  • 举报
回复
今天没时间。。。
bluedreammer 2003-09-15
  • 打赏
  • 举报
回复
ding ~
SoRoMan 2003-09-15
  • 打赏
  • 举报
回复
這是C生成的汇编代码:(循環段)TC是這樣優化的:

xor di,di
jmp short @5
@4:
xor si,si
jmp short @9
@8:
@7:
inc si
@9:
cmp si,MAX
jl @8
@6:
@3:
inc di
@5:
cmp di,MAXZ
jl @4
@2:
@1:
算法相同的情況下,C不可能比匯編快.
AthlonxpX86 2003-09-15
  • 打赏
  • 举报
回复
mov eax,maxz
a:
mov ecx,max
b:
loop b
dec eax
jnz a
我也觉的这段代码不错,但是不知道为什么,速度却是最慢的,而且我优化了一下,减少访存操作
mov eax,ebx
a:
mov ecx,edx
b:
//inc i
loop b
dec eax
jnz a
结果测试总计时间是22,你的代码时间是16-18,真想不通,到底该怎么优化,loop好像不行
sbw 2003-09-15
  • 打赏
  • 举报
回复
看看C生成的汇编代码,在它的基础上进行修改。
豆腐 2003-09-15
  • 打赏
  • 举报
回复
up
csdsjkk 2003-09-15
  • 打赏
  • 举报
回复
这个循环如果只是一个起延时作用的空循环,
可以这样写:
mov eax,maxz
a:
mov ecx,max
b:
loop b
dec eax
jnz a

AthlonxpX86 2003-09-15
  • 打赏
  • 举报
回复
to W32API 对,就是用汇编写for循环,循环里面暂时没有任务,如果效率高,我准备在里面用SSE处理数据

csdsjkk的代码确实效率比我高很多,加少了跳转次数,因此优化了指令流水线性能,测试时间
4-5.很不错,但是还是达不到C代码的速度.........

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧