| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 743 人关注过本帖
标题:【来显摆一下顺便欢迎大家讨论】【快得不让人省心】一个算法用SSE2重写了 变 ...
取消只看楼主 加入收藏
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
结帖率:100%
收藏
 问题点数:0 回复次数:6 
【来显摆一下顺便欢迎大家讨论】【快得不让人省心】一个算法用SSE2重写了 变快了 但结果不一致啊。。
先上结果和程序

ASM Elapsed 2421 ms
C Elapsed 3343 ms

程序如下 欢迎大家也跑跑 测试一下。。

程序+结果.zip (21.57 KB)


运行里面的run.bat会自动把俩程序跑一遍 结果在当前目录保存为文件

可惜啊 结果不一致 猜测可能是浮点数精度的问题 C语言的 加了参数也是编译成fpu 这个是80位精度的 而汇编直接用SSE2+少量SSE3指令 用的是64位 代码基本一样 速度确实能快一些 总得来说还是不错的 反正快了 论证了某些情况下汇编优化确实有用 提升比较明显 虽然代价很大

C代码如下

程序代码:
// 代码来自 <span style="color: #008000; text-decoration: underline;"><span style="color: #008000; text-decoration: underline;">https://bbs.bccn.net/thread-365456-1-1.html[/color]
[/color]// gcc -Wall fenxing.c -msse3 -march=core2 -mfpmath=sse -ffloat-store -o c.exe

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

#define BAILOUT 16
#define MAX_ITERATIONS 1000

#define SIZE (1024*1024*1)

char *pnow = NULL;

inline int put(char ch)
{
    *pnow++ = ch;
    return 0;
}

inline int mandelbrot(double x, double y)
{
    double cr = y - 0.5;
    double ci = x;
    double zi = 0.0;
    double zr = 0.0;
    int i = 0;

    while(1)
    {
        i++;
        double temp = zr * zi;
        double zr2 = zr * zr;
        double zi2 = zi * zi;
        zr = zr2 - zi2 + cr;
        zi = temp + temp + ci;
        if (zi2 + zr2 > BAILOUT)
            return i;
        if (i > MAX_ITERATIONS)
            return 0;
    }
}

int main()
{
    long t1 = 0, t2 = 0;
    char *pbuf = calloc(1, SIZE);
    pnow = pbuf;

    t1 = clock();

    int x,y;
    for (y = -399; y < 399; y++) {
        put('\n');
        for (x = -399; x < 399; x++) {
            int i = mandelbrot(x/400.0, y/400.0);
            if (i == 0)
                put('*');
            else
                put(' ');
        }
    }
    put('\n');

    t2 = clock();
    printf("C Elapsed %ld ms\n", (t2 - t1));
    printf("%s\n", pbuf);
    free(pbuf);

    return 0;
}


因为汇编版有问题 暂时不贴了 感兴趣的自己逆向罢。。

图片附件: 游客没有浏览图片的权限,请 登录注册


忘了帖图了 缩小后是这个样子 里面的白线是一行的宽度



[ 本帖最后由 zklhp 于 2012-12-2 13:02 编辑 ]
搜索更多相关主题的帖子: C语言 
2012-12-02 12:51
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
顺便纠正一下我在https://bbs.bccn.net/thread-365456-1-1.html里面犯的错误

当时是直接用printf打的 这样代码用时和输出的速度有关系 现在直接放内存里 用文件输出 最大限度的减小了输出对结果的影响 而且我记得我测试过 windows里面的命令行 好像1秒钟也就能打几千行结果 很多时候输出结果用时比运算用时要多 所以 可能的话还是输出到文件罢 我都是在内存盘里输出 几乎不受影响

顺便欢迎各位大牛批准指正 欢迎
2012-12-02 12:56
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
欢迎大家测试并提供测试结果 我想看看不同平台快多少或者慢多少。。
2012-12-02 15:17
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
在图书馆的奔腾4 3G上面的测试结果

C Elapsed 5500 ms
ASM Elapsed 3500 ms

不错 不错。。
2012-12-02 18:53
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
主频对运行速度肯定有影响 不过这个老奔腾 虽然有3G 但还跑不过我的core2 2G 所以主频不是决定因素。。。
2012-12-02 19:16
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用suijishu在2012-12-2 19:45:31的发言:

看起来SSE真是个好东西啊,版主写个教程吧
用精度换时间 也算是个好东西罢 教程么。。 我也是第一次这么大规模的用诶 我改天改改把代码发了

感谢您的支持
2012-12-02 20:10
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
SSE优化学问挺大的啊 我试着改写了一下我的代码 速度反而变慢了、、、、
2012-12-03 12:04
快速回复:【来显摆一下顺便欢迎大家讨论】【快得不让人省心】一个算法用SSE2重写 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018869 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved