【来显摆一下顺便欢迎大家讨论】【快得不让人省心】一个算法用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 编辑 ]