无心人
发表于 2008-3-6 11:08:51
我想这么写
xmm0=r0:1:2:3
xmm1=l0:1:2:3
xmm0=xmm0*xmm1
则xmm0 = (0:0) /2:2
但其他组合,并无好方式处理
如果越界
xmm0=r1:2:3:X
恐怕出现非法读错误吧
无心人
发表于 2008-3-6 11:10:36
除了movd movq pmuludq movdq2q movq2dq外
还下面的指令似乎有用
pack的似乎无处理DWORD的好指令
PUNPCKHDQ instruction with 128-bit operands:
DEST ← DEST;
DEST ← SRC;
DEST ← DEST;
DEST ← SRC;
PUNPCKHQDQ instruction:
DEST ← DEST;
DEST ← SRC;
PUNPCKLDQ instruction with 128-bit operands:
DEST ← DEST;
DEST ← SRC;
DEST ← DEST;
DEST ← SRC;
PUNPCKLQDQ
DEST ← DEST;
DEST ← SRC;
MOVDDUP—Move One Double-FP and Duplicate
dest = src
dest=src
无心人
发表于 2008-3-6 11:13:02
另外
乘法得到的寄存器结果
必须要照顾后来的加操作
加必须要解开64位乘结果为两个32位数字
否则加会溢出
liangbch
发表于 2008-3-6 11:15:49
我先在的想法是, 掉用 pmuludq 6次, 调用mul指令4次,完成乘法计算,至于进位,使用xmm 128bit寄存器计算。
liangbch
发表于 2008-3-6 11:19:39
确如无心人所言,解包很麻烦,从而引起指令数增加。不过,我想试试,到底是直接的方法(一次只计算32bit * 32bit)快呢,还是使用复杂的方法(一次 计算2 个32bit * 32bit )快呢?
无心人
发表于 2008-3-6 11:28:41
http://topic.csdn.net/t/20040713/08/3168983.html
这里有我老帖
是我说MMX寄存器乘法快的证据
=============================
另外我刚想到一个好办法
能得到双乘法效果
且能得到全部16个乘
下午看看
不过可惜这么做
SSE寄存器不够用
64位好了
有16个
:)
liangbch
发表于 2008-3-6 12:22:16
我还是找不到打包乘,然后解包并处理进位的有效手段,指令增加的太厉害了,决定放弃这个方案。
gxqcn
发表于 2008-3-6 12:46:34
原帖由 无心人 于 2008-3-6 11:28 发表 http://bbs.emath.ac.cn/images/common/back.gif
不过可惜这么做
SSE寄存器不够用
64位好了
有16个
寄存器不够可以在汇编中使用栈嘛:)
推荐大家用我在 6# 发的附件,因为它实现了:
1、CPU指令集的自动识别;
2、高精度计时器;
3、一个高效且可靠的对比函数,以方便大家检验自己算法的正确与否;
4、一个统一的测试接口。
为了大家有个公平的擂台环境,我想补充几条规定:
1、允许使用C语言以及ALU、MMX、SSE、SSE2汇编,SSE3/SSE4及未来的SSE5暂不予考虑;
2、编译器及版本不限;
3、OS暂限定于32位平台;
4、测试程序中不允许多线程(比如说将1000万次测试分拆成两个500万次并行线程);
5、提交的最终代码,应保证函数级完整,以方便他人测试(普通交流,允许发代码片断);
6、提交的函数名推荐以 6# 描述的那样:“UInt128x128To256_{1}_{2}(...) ”,
其中{1}代表用到的最高级指令集;
{2}代表发帖楼层,如果写错了可以自行修订或请管理员帮助修改。
对于最后的优胜者,可以考虑一定的奖励;
只是还没想好具体方式(主要以论坛积分等形式),欢迎大家讨论。。。
无心人
发表于 2008-3-6 13:38:33
奖励什么就免了
除非你有权把CSDN社区银行的书换成我感兴趣的
哈哈
SSE4也无法分解64位
所以分解还得movd加移位
无心人
发表于 2008-3-6 13:42:29
使用堆栈并不比分步乘简单
所以使用堆栈方案我觉得可以Cancel
如果有简单方法能做到循环移位
我有很少指令做16个乘法的方案
以下四行一组, 第一行为left, 第二行为right, 数字为双字编号,
第三四行为双乘结果对应编号 X:Y 代表leftX*rightY
前4个能通过简单移位得到, 后四个要看Movd xmm, mem32是否冲掉xmm的高96位!!
如果否, 则简单, 如果是, 则需要POR指令还加一个额外积存器
0 1 2 3
0 1 2 3
0:0
2:2
1 2 3 0
1 2 3 0
1:1
3:3
0 1 2 3
1 2 3 0
0:1
2:3
1 2 3 0
0 1 2 3
1:0
3:2
3 0 1 2
0 1 2 3
3:0
1:2
0 1 2 3
3 0 1 2
0:3
2:1
0 1 2 3
2 3 0 1
0:2
2:0
1 2 3 0
3 0 1 2
1:3
3:1
页:
1
2
[3]
4
5
6
7
8
9
10
11
12