龙芯开源社区

 找回密码
 注册新用户(newuser)
楼主: matman

龙芯的性能调优(一)

[复制链接]
发表于 2008-10-19 19:59:31 | 显示全部楼层
用浮点寄存器还会导致进程切换时要保存更多的寄存器  我想可能这才是memcpy不使用浮点寄存器的真正原因吧
发表于 2008-10-19 20:05:30 | 显示全部楼层
原帖由 matman 于 2008-10-19 19:57 发表
浮点寄存器在这里只是放一下值,不用作任何定点浮点转换。ldc1直接就把数取到了寄存器里,用不着dmfc1
换句话说
ld $t4,0($a0)
sd $t4,0($a1)

ldc1 $f0,0($a0)
sdc1 $f0,0($a1)
完成的功能是完全一样的,都 ...


我印象中凡是进入浮点寄存器的数据都是要经过格式转换的  看来我得再查查资料了

[ 本帖最后由 water 于 2008-10-19 20:06 编辑 ]
发表于 2008-10-19 20:06:06 | 显示全部楼层
把它做成一个可执行的文件。。不是所有人都懂这个
 楼主| 发表于 2008-10-19 20:06:26 | 显示全部楼层

回复 11# 的帖子

进程切换确实是一个问题。现在一般的处时是不保存浮点寄存器,如果就此而出错,则触发异常来处理。见http://en.wikipedia.org/wiki/Context_switch
由于context switch相对不频繁,所以相比load/spill的开销几乎可以忽略。
库里,或者说所有gcc生成的代码里没有用浮点寄存器是对性能的一大浪费。事实上龙芯还专门设计了指令用浮点部件作整点运算,只不过还没有编译器能发挥这一功能。
发表于 2008-10-19 20:15:18 | 显示全部楼层
原帖由 matman 于 2008-10-19 20:06 发表
进程切换确实是一个问题。现在一般的处时是不保存浮点寄存器,如果就此而出错,则触发异常来处理。见http://en.wikipedia.org/wiki/Context_switch
由于context switch相对不频繁,所以相比load/spill的开销几乎可以忽略。
库里,或者说所有gcc生成的代码里没有用浮点寄存器是对性能的一大浪费。事实上龙芯还专门设计了指令用浮点部件作整点运算,只不过还没有编译器能发挥这一功能。


不会吧  进程切换不保存浮点寄存器  俺的进程敢用么  时刻得担心寄存器莫名其妙地变了个值

不过如果浮点部件作整点运算真很方便的话  用汇编应该比编译器能更快地发挥这个功能
 楼主| 发表于 2008-10-19 20:25:41 | 显示全部楼层

回复 15# 的帖子

为保存的情况是这样的:当一个进程被切换出去又切回来后,OS会设一个TS位,同时监视你接下来对浮点寄存器的使用。只要你读了,就会发生异常,然后通过异常处理来保证你读的值是对的。
具体保存不保存取决于OS实现,如mips R4k的代码如下:
/*
* [jsun] FPU context is saved if and only if the process has used FPU in
* the current run (PF_USEDFPU).  In any case, the CU1 bit for user space
* STATUS register should be 0, so that a process *always* starts its
* userland with FPU disabled after each context switch.
*
* FPU will be enabled as soon as the process accesses FPU again, through
* do_cpu() trap.
*/

http://www.google.com/codesearch ... el/r4k_switch.S#l30
发表于 2008-10-19 20:27:18 | 显示全部楼层
原帖由 water 于 2008-10-19 20:05 发表


我印象中凡是进入浮点寄存器的数据都是要经过格式转换的  看来我得再查查资料了

SD rt, offset(base)
Operation:
vAddr ← sign_extend(offset) + GPR[base]
if vAddr2..0 ≠ 03 then
SignalException(AddressError)
endif
(pAddr, CCA)← AddressTranslation (vAddr, DATA, STORE)
datadoubleword← GPR[rt]
StoreMemory (CCA, DOUBLEWORD, datadoubleword, pAddr, vAddr, DATA)

----------------------
SDC1 ft, offset(base)
Operation:
vAddr ← sign_extend(offset) + GPR[base]
if vAddr2..0 ≠ 03 then
SignalException(AddressError)
endif
(pAddr, CCA) ← AddressTranslation(vAddr, DATA, STORE)
datadoubleword ← ValueFPR(ft, UNINTERPRETED_DOUBLEWORD)
StoreMemory(CCA, DOUBLEWORD, datadoubleword, pAddr, vAddr, DATA)

通过对比发现sd与sdc1的不同点 sd 是datadoubleword← GPR[rt] 而sdc1是datadoubleword ← ValueFPR(ft, UNINTERPRETED_DOUBLEWORD)  不知ValueFPR是不是格式转换  希望知道的能说明一下
 楼主| 发表于 2008-10-19 20:32:22 | 显示全部楼层

回复 17# 的帖子

ValueFPR(ft, UNINTERPRETED_DOUBLEWORD)就是原值不作变换
可以gdb跟一下看一下
发表于 2008-10-19 20:35:36 | 显示全部楼层
原帖由 matman 于 2008-10-19 20:25 发表
为保存的情况是这样的:当一个进程被切换出去又切回来后,OS会设一个TS位,同时监视你接下来对浮点寄存器的使用。只要你读了,就会发生异常,然后通过异常处理来保证你读的值是对的。
具体保存不保存取决于OS实现, ...


呵呵  就是说OS如果发现浮点寄存器被使用  在将进程切换出去之前  会保存浮点寄存器  否则就忽略之
发表于 2008-10-19 20:36:41 | 显示全部楼层
原帖由 matman 于 2008-10-19 20:32 发表
ValueFPR(ft, UNINTERPRETED_DOUBLEWORD)就是原值不作变换
可以gdb跟一下看一下


呵呵  老大  这是CPU内部的电路  用gdb能看出来吗

本版积分规则

小黑屋|手机版|Archiver|Lemote Inc.  

GMT+8, 2019-8-22 00:47 , Processed in 0.176690 second(s), 16 queries .

快速回复 返回顶部 返回列表