龙芯开源社区

 找回密码
 注册新用户(newuser)
查看: 3555|回复: 5

龙芯 的 编译器 优化问题,gcc 4.7 不如 4.4?

[复制链接]
发表于 2012-10-7 14:24:38 | 显示全部楼层 |阅读模式
测试了一个简单的矩阵乘法,结果用自己编译的官方gcc 4.7 比lemote源里面的 4.4 编译出来的程序跑的还慢,差20%。

#include <stdio.h>
#include <stdlib.h>

int n;

int arr1[1000][1000];
int arr2[1000][1000];
int arr3[1000][1000];

int main()
{
int temp;
int i,j,k;
n=1000;

#pragma omp parallel for private(i, j, k, temp)  
    for(i=0; i<n; ++i) {  
      for(j=0; j<n; ++j) {  
         temp = 0;  
        for(k=0; k<n; ++k) {  
          temp += arr1[i][k] * arr2[k][j];  
        }  
        arr3[i][j] = temp;  
      }  
    }  
return n;
}

编译出来的汇编文件,主要是这几行差别:  
  gcc-4.7  -O3 -o b.s a.c  -march=loongson3a -S
   gcc   -O3 -o a.s a.c  -march=loongson2f -S

--- a.s        2012-10-07 14:01:54.894133376 +0800
+++ b.s        2012-10-07 14:01:42.935031813 +0800
@@ -3,7 +3,7 @@
        .previous
        .gnu_attribute 4, 1
        .abicalls
-        .text
+        .section        .text.startup,"ax",@progbits
        .align        2
        .globl        main
        .set        nomips16
@@ -15,64 +15,62 @@
        .fmask        0x00000000,0
        .set        noreorder
        .set        nomacro
-       
        lui        $28,%hi(__gnu_local_gp)
        li        $3,1000                        # 0x3e8
-        move        $13,$0
-        li        $8,1000                        # 0x3e8
        addiu        $28,$28,%lo(__gnu_local_gp)
+        move        $12,$0
        lw        $2,%got(n)($28)
-        lw        $15,%got(arr1)($28)
-        lw        $11,%got(arr2)($28)
-        lw        $14,%got(arr3)($28)
+        li        $7,4000                        # 0xfa0
+        li        $11,1000                        # 0x3e8
+        lw        $6,%got(arr1)($28)
+        lw        $10,%got(arr2)($28)
+        lw        $13,%got(arr3)($28)
        sw        $3,0($2)
$L2:
-        sll        $2,$13,2
-        sll        $10,$13,7
-        move        $9,$0
-        subu        $10,$10,$2
-        addu        $10,$10,$13
-        sll        $10,$10,5
-        addu        $12,$15,$10
-        addu        $10,$14,$10
+        sll        $2,$12,2
+        sll        $9,$12,7
+        subu        $9,$9,$2
+        move        $8,$0
+        addu        $9,$9,$12
+        sll        $9,$9,5
+        addu        $9,$13,$9
$L6:
-        sll        $3,$9,2
-        move        $4,$12
+        sll        $3,$8,2
        move        $2,$0
-        move        $5,$0
-        addu        $3,$11,$3
+        addu        $3,$10,$3
+        mtlo        $0
$L3:
-        lw        $7,0($3)
-        addiu        $2,$2,1
+        addu        $5,$6,$2
+        lw        $4,0($3)
+        addiu        $2,$2,4
+        lw        $5,0($5)
        addiu        $3,$3,4000
-        lw        $6,0($4)
-        addiu        $4,$4,4
-        multu.g        $6,$7,$6
-        bne        $2,$8,$L3
-        addu        $5,$5,$6
-
-        addiu        $9,$9,1
-        sw        $5,0($10)
-        bne        $9,$2,$L6
-        addiu        $10,$10,4
+        bne        $2,$7,$L3
+        madd        $5,$4

-        addiu        $13,$13,1
-        bne        $13,$9,$L2
-        li        $2,1000                        # 0x3e8
+        mflo        $2
+        addiu        $8,$8,1
+        sw        $2,0($9)
+        bne        $8,$11,$L6
+        addiu        $9,$9,4
+
+        addiu        $12,$12,1
+        bne        $12,$8,$L2
+        addiu        $6,$6,4000

        j        $31
-        nop
+        li        $2,1000                        # 0x3e8

        .set        macro
        .set        reorder
        .end        main
        .size        main, .-main

-        .comm        n,4,4
-
-        .comm        arr1,4000000,4
+        .comm        arr3,4000000,4

        .comm        arr2,4000000,4

-        .comm        arr3,4000000,4
-        .ident        "GCC: (Debian 4.4.5-8) 4.4.5"
+        .comm        arr1,4000000,4
+
+        .comm        n,4,4
+        .ident        "GCC: (GNU) 4.7.2"
发表于 2012-10-11 11:40:03 | 显示全部楼层
疑惑,b.s用什么做乘的?
 楼主| 发表于 2012-10-13 11:38:33 | 显示全部楼层
a.s 和 b.s 是用一个a.c文件编译出来的。
gcc可以只生成代码不汇编。

乘法应该是同一个指令。我列出的是差异。
 楼主| 发表于 2012-10-13 11:40:07 | 显示全部楼层
回复 3# liyulongmen


好像主要的差别的话几个常数和指令顺序。

莫非是4.7的优化不够成熟?
发表于 2012-10-17 15:37:10 | 显示全部楼层
都用 2F 的优化呢?你这一个 3A 一个 2F 没有可比性啊。
我觉得可能是 3A 的优化还没做完。或者 3A 有变?
发表于 2012-11-27 00:11:44 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

本版积分规则

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

GMT+8, 2019-9-16 06:28 , Processed in 0.182786 second(s), 18 queries .

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