URN Logo
UNIX Resources » Linux » China Linux Forum » CPU 与 编译器 » 3 » 有会MIPS汇编的吗?
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
有会MIPS汇编的吗?
有会MIPS汇编的吗? - cooleyes [2006-10-25 19:24 | 1,210 byte(s)]
 
Re: 有会MIPS汇编的吗? - lingcore [2006-10-26 03:02 | 726 byte(s)]
 
Re: 有会MIPS汇编的吗? - cooleyes [2006-10-26 10:18 | 156 byte(s)]
 
Re: 有会MIPS汇编的吗? - lingcore [2006-10-26 12:08 | 559 byte(s)]
 
Re: 有会MIPS汇编的吗? - cooleyes [2006-10-26 13:12 | 230 byte(s)]
 
Re: 有会MIPS汇编的吗? - lingcore [2006-10-27 01:20 | 455 byte(s)]
 
Re: 有会MIPS汇编的吗? - cooleyes [2006-10-27 11:26 | 4,131 byte(s)]
 
Re: 有会MIPS汇编的吗? - cooleyes [2006-10-27 11:44 | 203 byte(s)]
 
Re: 有会MIPS汇编的吗? - lingcore [2006-10-27 12:12 | 40 byte(s)]
 
Re: 有会MIPS汇编的吗? - cooleyes [2006-10-27 12:15 | 88 byte(s)]
 
Re: 有会MIPS汇编的吗? - lingcore [2006-10-27 13:26 | 655 byte(s)]
 
Re: 有会MIPS汇编的吗? - cooleyes [2006-10-27 14:23 | 732 byte(s)]
 
Re: 有会MIPS汇编的吗? - lingcore [2006-11-07 07:53 | 754 byte(s)]
 
Re: 有会MIPS汇编的吗? - cooleyes [2006-11-14 11:16 | 166 byte(s)]
 
Subject: 有会MIPS汇编的吗?
Author: cooleyes    Posted: 2006-10-25 19:24    Length: 1,210 byte(s)
[Original] [Print] [Top]
有两个函数,需要优化一下
芯片是MIPS R4000的

EXPAND_16_TIMES是个宏

#define EXPAND_16_TIMES(CODE) CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE
CODE CODE CODE CODE CODE

void Adapt(short * pM, short * pAdapt, int nDirection, int nOrder)
{
nOrder >>= 4;

if (nDirection < 0)
{
while (nOrder--)
{
EXPAND_16_TIMES(*pM++ += *pAdapt++;)
}
}
else if (nDirection > 0)
{
while (nOrder--)
{
EXPAND_16_TIMES(*pM++ -= *pAdapt++;)
}
}
}

int CalculateDotProduct(short * pA, short * pB, int nOrder)
{
int nDotProduct = 0;
nOrder >>= 4;

while (nOrder--)
{
EXPAND_16_TIMES(nDotProduct += *pA++ * *pB++;)
}

return nDotProduct;
}


[Original] [Print] [Top]
Subject: Re: 有会MIPS汇编的吗?
Author: lingcore    Posted: 2006-10-26 03:02    Length: 726 byte(s)
[Original] [Print] [Top]
GCC 优化编译:

gcc-mips -O3 <your program>

已经做得非常好。比如,对下面语句的翻译中

*pM++ += *pAdapt++

许多操作都尽量在寄存器中进行,循环中对存储器的修改只限于保存*pM的结果,对
pM和pAdapt值的修改基本上在寄存器内进行,仅在最后才保存其结果。相邻指令之
间尽量使用不同的寄存器,尽可能使流水线发挥最大效益。原程序中上面语句有多次重复,
但每段编译结果中用的寄存器都不一样,目的是使各段使用不同的寄存器,减少指令间的
冲突,增加流水线效益。虽然编译结果可能还有改进余地,但手工做代价比较大,
上述语句16次重复需要一个个的修改。

MIPS4000好像没有SIMD指令,不然的话可以做向量计算优化。
[Original] [Print] [Top]
Subject: Re: 有会MIPS汇编的吗?
Author: cooleyes    Posted: 2006-10-26 10:18    Length: 156 byte(s)
[Original] [Print] [Top]
嗯,我的本意就是想做向量计算优化
原来的代码中有MMX的汇编版本,采用SIMD指令来优化
我对MIPS不熟,所以就想请教能否在R4000上优化那16次循环加法
[Original] [Print] [Top]
Subject: Re: 有会MIPS汇编的吗?
Author: lingcore    Posted: 2006-10-26 12:08    Length: 559 byte(s)
[Original] [Print] [Top]
MIPS曾经计划增加向量指令集,不清楚做成没有:

http://www.eecg.utoronto.ca/~corinna/vector/svx/index.html

你可以查一下你的机器手册,看看有没有向量指令。

有研究人员做过向量MIPS:
http://www.eecg.utoronto.ca/~corinna/vector/

据说龙芯也有向量指令,具体情况不清。
[Original] [Print] [Top]
Subject: Re: 有会MIPS汇编的吗?
Author: cooleyes    Posted: 2006-10-26 13:12    Length: 230 byte(s)
[Original] [Print] [Top]
嗯,我查查看
其实这机器是Sony 的PSP

从网上的资料来看,是MIPS R4000的芯片(但似乎是32位,我记得R4000应该是64位的啊)
没有类似于MMX的整数向量指令,但有浮点向量运算单元(VFPU),不知道能不能用得上
[Original] [Print] [Top]
Subject: Re: 有会MIPS汇编的吗?
Author: lingcore    Posted: 2006-10-27 01:20    Length: 455 byte(s)
[Original] [Print] [Top]
Sony PSP 配有一个向量处理单元,此外还有Media Processor(MPU):
http://en.wikibooks.org/wiki/PSP_Programming/Hardware_Description

所以做向量运算没有问题。但不知道那里能找到它的汇编语言手册。

上面程序的向量化还要注意一个问题,就是指针pM, pAdapt不能指向同一个数组的
相邻元素。
[Original] [Print] [Top]
Subject: Re: 有会MIPS汇编的吗?
Author: cooleyes    Posted: 2006-10-27 11:26    Length: 4,131 byte(s)
[Original] [Print] [Top]
嗯,我写了一下,不知道对不对,因为psp现在没电了,没法测试


#define vfpuadd16
__asm__ volatile(
"lv.q R100, %0 "
"lv.q R101, %1 "
"lv.q R102, %2 "
"lv.q R103, %3 "
"lv.q R000, %4 "
"lv.q R001, %5 "
"lv.q R002, %6 "
"lv.q R003, %7 "
"vadd.q R100, R100, R000 "
"vadd.q R101, R101, R001 "
"vadd.q R102, R102, R002 "
"vadd.q R103, R103, R003 "
"sv.q R100, %0 "
"sv.q R101, %1 "
"sv.q R102, %2 "
"sv.q R103, %3 "
: "+m" (blockM32[4*0]),
"+m" (blockM32[4*1]),
"+m" (blockM32[4*2]),
"+m" (blockM32[4*3]),
"+m" (blockAdapt32[4*0]),
"+m" (blockAdapt32[4*1]),
"+m" (blockAdapt32[4*2]),
"+m" (blockAdapt32[4*3]) ) ;

#define vfpusub16
__asm__ volatile(
"lv.q R100, %0 "
"lv.q R101, %1 "
"lv.q R102, %2 "
"lv.q R103, %3 "
"lv.q R000, %4 "
"lv.q R001, %5 "
"lv.q R002, %6 "
"lv.q R003, %7 "
"vsub.q R100, R100, R000 "
"vsub.q R101, R101, R001 "
"vsub.q R102, R102, R002 "
"vsub.q R103, R103, R003 "
"sv.q R100, %0 "
"sv.q R101, %1 "
"sv.q R102, %2 "
"sv.q R103, %3 "
: "+m" (blockM32[4*0]),
"+m" (blockM32[4*1]),
"+m" (blockM32[4*2]),
"+m" (blockM32[4*3]),
"+m" (blockAdapt32[4*0]),
"+m" (blockAdapt32[4*1]),
"+m" (blockAdapt32[4*2]),
"+m" (blockAdapt32[4*3]) ) ;


static inline void AdaptVFPUAdd(short * pM, const short * pAdapt) {
float blockM32[16];
float blockAdapt32[16];
for(int i = 0; i < 16; i++)
{
blockM32[i] = *(pM+i);
blockAdapt32[i] = *(pAdapt+i);
}
vfpuadd16;
for(int i = 0; i < 16; i++)
{
*(pM+i) = (short)blockM32[i];
}
}

static inline void AdaptVFPUSub(short * pM, const short * pAdapt) {
float blockM32[16];
float blockAdapt32[16];
for(int i = 0; i < 16; i++)
{
blockM32[i] = *(pM+i);
blockAdapt32[i] = *(pAdapt+i);
}
vfpusub16;
for(int i = 0; i < 16; i++)
{
*(pM+i) = (short)blockM32[i];
}
}

void Adapt(short * pM, const short * pAdapt, int nDirection, int nOrder)
{
nOrder >>= 4;

if (nDirection < 0)
{
while (nOrder--)
{
AdaptVFPUAdd(pM, pAdapt);
pM+=16;
pAdapt+=16;
//EXPAND_16_TIMES(*pM++ += *pAdapt++;)
}
}
else if (nDirection > 0)
{
while (nOrder--)
{
AdaptVFPUSub(pM, pAdapt);
pM+=16;
pAdapt+=16;
//EXPAND_16_TIMES(*pM++ -= *pAdapt++;)
}
}
}
[Original] [Print] [Top]
Subject: Re: 有会MIPS汇编的吗?
Author: cooleyes    Posted: 2006-10-27 11:44    Length: 203 byte(s)
[Original] [Print] [Top]
PSP的VFPU有8个4×4的浮点寄存器

具体描述:
http://bradburn.net/mr.mr/vfpu.html
[Original] [Print] [Top]
Subject: Re: 有会MIPS汇编的吗?
Author: lingcore    Posted: 2006-10-27 12:12    Length: 40 byte(s)
[Original] [Print] [Top]
用浮点运算器做整数运算是不是代价太大了?
[Original] [Print] [Top]
Subject: Re: 有会MIPS汇编的吗?
Author: cooleyes    Posted: 2006-10-27 12:15    Length: 88 byte(s)
[Original] [Print] [Top]
我也有这种感觉
问题是,它没有向量整数寄存器
不知道这样行不行
[Original] [Print] [Top]
Subject: Re: 有会MIPS汇编的吗?
Author: lingcore    Posted: 2006-10-27 13:26    Length: 655 byte(s)
[Original] [Print] [Top]
如果有浮点向量处理器的话,一般应该有整数向量处理器,
或者FPU同时支持整数向量运算。具体情况要看他们的手册。

下面的程序是有问题的:

float blockM32[16];

float blockAdapt32[16];

for(int i = 0; i < 16; i++)

{

blockM32[i] = *(pM+i);

这里把short赋值给浮点对象,发生了从整数到浮点的转换,很费时间。以后用浮点
做加法更费时间,最后结果还要再转换到整数。这个过程足以顺序完成一批整数的
加法运算。如果一个浮点寄存器是32位,原本可以存两个short,上面的做法只能存一个。
[Original] [Print] [Top]
Subject: Re: 有会MIPS汇编的吗?
Author: cooleyes    Posted: 2006-10-27 14:23    Length: 732 byte(s)
[Original] [Print] [Top]
嗯,似乎没有整数指令
其寄存器是一个单精度浮点单元,4字节
是可以存2short,但我们不能把两个short放进去
因为其指令运算的时候,一个寄存器当一个浮点数来运算
A1A2 + A3A4
而我们其实是要A1+A3, A2+A4
有可能会有位溢出导致错误结果


这里有两份文档
http://kedem.cs.duke.edu/cps104/Handouts/MIPS-asm.pdf
http://hitmen.c02.at/files/docs/psp/R4400_Uman_book_Ed2.pdf

可惜我水平不行,没研究透
[Original] [Print] [Top]
Subject: Re: 有会MIPS汇编的吗?
Author: lingcore    Posted: 2006-11-07 07:53    Length: 754 byte(s)
[Original] [Print] [Top]
这两份文档不错,是学校MIPS的好材料。不过它们都是关于MIPS R4000的核心,核心
中并没有向量操作。SONY PSP在R4000之外又配了一个向量单元,它也许可以支持上
面程序所需要的向量运算:
http://en.wikibooks.org/wiki/PSP_Programming/Hardware_Description

PSP编程的一些文档资料有:
http://www.osix.net/modules/article/?id=713
http://www.oopo.net/consoledev/

[Original] [Print] [Top]
Subject: Re: 有会MIPS汇编的吗?
Author: cooleyes    Posted: 2006-11-14 11:16    Length: 166 byte(s)
[Original] [Print] [Top]
嗯,PSP是有向量单元,不过是浮点向量单元
中间需要short -> float -> add -> float -> short
速度比原来的还慢,我已经测试完了
[Original] [Print] [Top]
« Previous thread
正在翻译gas internals
CPU 与 编译器
3
Next thread »
cosy compiler
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 03:47:11, cost 0.081962108612061 ms.