GCC内联汇编实现向量规约的例子

有了前面一个基础,这个就比较容易折腾出来了,只是换了个表达方式,所以也很快就出炉,负责计算的函数的性能仍然跟GCC(3.4.5)优化后的时间一致,但是因为不知道怎么进一步该这个程序,所以就只能到这个地步了,以后有改进的会继续发布。

#include <stdio.h>

#include <time.h>

#define N 1024*1024*1024

#define M 10

int vector_reduction(int *a, int count)

{

        int result = 0;

        __asm__ __volatile__(

        "xor % % rax, % % rax;"

        "xor % % ebx, % % ebx;"

        "cmp % % ebx, % % edx;"

        "je 2f;"

        "1:"

        "add (% % rsi), % % rax;"

        "add $4, % % rsi;"

        "add $1, % % ebx;"

        //"inc % % rsi;"

        //"inc % % ebx;"

        "cmp % % ebx, % % edx;"

        "ja 1b;"

        "2:"

        :"=a"(result), "=S"(a), "=d"(count)

        :"a"(result), "S"(a), "d"(count)

        :"ebx", "memory"

        );

        return result;

}

 

int main()

{

        int *a = (int *)malloc(sizeof(int) * N);

        int i, result;

        clock_t start, ctime;

        start = clock();

        for(i = 0; i < N; ++i)

                a[i] = 1;

        ctime = clock() - start;

        printf("initial time: % d s\n", ctime / CLOCKS_PER_SEC);

        start = clock();

        for(i = 0; i < M; ++i)

                result = vector_reduction(a, N);

        ctime = clock() - start;

        printf("sum = % d\n", result);

        printf("compute time: % d s\n", ctime / CLOCKS_PER_SEC);

        free(a);

        return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值