免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1511 | 回复: 7
打印 上一主题 下一主题

内嵌汇编应用sse计算矩阵的问题 请教!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-31 12:46 |只看该作者 |倒序浏览
我想利用sse指令计算一个4*4的float矩阵,然后写了一段内嵌汇编的c程序,结果编译没问题,运行时出了问题。

程序在输出“hello”之后就卡在那里不动了,请教各位是什么问题啊~~
  1. #include <stdio.h>


  2.     float a[4][4] __attribute__ ((aligned (16))) = {
  3.         {1.0,2.0,3.0,4.0},
  4.         {1.0,2.0,3.0,4.0},
  5.         {1.0,2.0,3.0,4.0},
  6.         {1.0,2.0,3.0,4.0}
  7.     };

  8.     float b[4][4] __attribute__ ((aligned (16))) = {
  9.         {1.0,2.0,3.0,4.0},
  10.         {1.0,2.0,3.0,4.0},
  11.         {1.0,2.0,3.0,4.0},
  12.         {1.0,2.0,3.0,4.0}
  13.     };


  14.     float c[4][4] __attribute__ ((aligned (16)));

  15. void matMul(float result[4][4],float left[4][4],float right[4][4])
  16. {
  17.         printf("hello\n");
  18.         __asm__ __volatile__
  19.         (
  20.                 "movaps (%2),%%xmm4        \n\t"
  21.                 "movaps 16(%2),%%xmm5        \n\t"
  22.                 "movaps 32(%2),%%xmm6        \n\t"
  23.                 "movaps 48(%2),%%xmm7        \n\t"
  24.                 "movl $0,%%edi                \n\t"
  25.                 "movl $4,%%ecx                \n\t"
  26. "lab:\n\t"        "movups (%1,%2,1),%%xmm0        \n\t"
  27.                 "movaps %%xmm0,%%xmm1        \n\t"
  28.                 "movaps %%xmm0,%%xmm2        \n\t"
  29.                 "movaps %%xmm0,%%xmm3        \n\t"
  30.                 "shufps $0x00,%%xmm0,%%xmm0        \n\t"
  31.                 "shufps $0x55,%%xmm1,%%xmm1        \n\t"
  32.                 "shufps $0xAA,%%xmm2,%%xmm2        \n\t"
  33.                 "shufps $0xFF,%%xmm3,%%xmm3        \n\t"
  34.                 "mulps %%xmm4,%%xmm0        \n\t"
  35.                 "mulps %%xmm5,%%xmm1        \n\t"
  36.                 "mulps %%xmm6,%%xmm2        \n\t"
  37.                 "mulps %%xmm7,%%xmm3        \n\t"
  38.                 "addps %%xmm0,%%xmm2        \n\t"
  39.                 "addps %%xmm1,%%xmm3        \n\t"
  40.                 "addps %%xmm2,%%xmm3        \n\t"
  41.                 "movups %%xmm3,(%0,%2,1)        \n\t"
  42.                 "addl $16,%%edi                \n\t"
  43.                 "loop lab                \n\t"
  44.                 :"=d"(result)
  45.                 :"a"(left),"D"(right)
  46.                 :"%ecx"
  47.         );
  48. }

  49. int main()
  50. {
  51.     int i,j;

  52.     matMul(c,a,b);
  53.    
  54.     for(i = 0; i<4; i++)
  55.     {
  56.         for(j = 0; j<4; j++)
  57.             printf("%lf ",c[i][j]);
  58.         printf("\n");
  59.     }
  60. }
复制代码

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
2 [报告]
发表于 2012-05-31 12:57 |只看该作者
loop lab 到啥年月是个头呀?

论坛徽章:
0
3 [报告]
发表于 2012-05-31 13:53 |只看该作者
回复 2# mirnshi

谢谢你,我是汇编初学者~~

我想用sse算完结果就跳出来,应该怎么改?


   

论坛徽章:
0
4 [报告]
发表于 2012-05-31 14:01 |只看该作者
mirnshi 发表于 2012-05-31 12:57
loop lab 到啥年月是个头呀?


每次loop都要递减ecx不是么?

开始设置了4,应该循环四次就退出了啊。。。

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
5 [报告]
发表于 2012-05-31 14:02 |只看该作者
zhangyiviva 发表于 2012-05-31 14:01
每次loop都要递减ecx不是么?

开始设置了4,应该循环四次就退出了啊。。。

晕,你总得跳出循环吧。

论坛徽章:
0
6 [报告]
发表于 2012-05-31 14:13 |只看该作者
mirnshi 发表于 2012-05-31 14:02
晕,你总得跳出循环吧。


不是,自己跳出的么?

那应该怎么跳出啊,多谢了!

论坛徽章:
0
7 [报告]
发表于 2012-05-31 14:28 |只看该作者
回复 5# mirnshi

懂了,谢谢你~~



   

论坛徽章:
0
8 [报告]
发表于 2012-05-31 14:39 |只看该作者
回复 5# mirnshi

现在变成段错误了。。。


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP