|
|

楼主 |
发表于 2005-9-1 18:01:00
|
显示全部楼层
Re:sse汇编高手请近,难道vc6编译器的优化能力比sse指令更
/**
* SIMD_TEST.CPP
*/
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
#include "windowsx.h"
#include <stdio.h>
#define TEST_TIMES 10 // 测试10次求平均以得到稳定结果
#define COMPUTE_TIMES 1000000 // 每项测试的计算次数
int main(int argc, char* argv[]){
__declspec(align(16)) float x[4] = {1,2,3,4};
__declspec(align(16)) float y[4] = {5,6,7,8};
__declspec(align(16)) float z[4] = {0,0,0,0};
__declspec(align(16)) float c[4] = {0.5, 0.5, 0.5, 0.5};
// 使用高精度计时器,随系统的不同可以提供微秒级的计数。
LARGE_INTEGER t1, t2, tc;
QueryPerformanceFrequency(&tc);
printf("Frequency: %u\n", tc.QuadPart);
int tav1 = 0; // 测试1(常规方法)的平均用时
int tav2 = 0; // 测试2(SSE汇编)的平均用时
for(int j = 0; j < TEST_TIMES; j ++){
// test 1......
int i = 0;
QueryPerformanceCounter(&t1);
for(i = 0; i < COMPUTE_TIMES; i ++){
z[0] = x[0] + y[0];
z[1] = x[1] + y[1];
z[2] = x[2] + y[2];
z[3] = x[3] + y[3];
}
/* z = x*x+y*y+0.5
for(i = 0; i < 1000000; i ++){
z[0] = x[0]*x[0] + y[0]*y[0] + c[0];
z[1] = x[1]*x[1] + y[1]*y[1] + c[1];
z[2] = x[2]*x[2] + y[2]*y[2] + c[2];
z[3] = x[3]*x[3] + y[3]*y[3] + c[3];
}
*/
QueryPerformanceCounter(&t2);
tav1 += (t2.QuadPart - t1.QuadPart);
//printf("x[%f, %f, %f, %f]\n", x[0], x[1], x[2], x[3]);
//printf("y[%f, %f, %f, %f]\n", y[0], y[1], y[2], y[3]);
//printf("z[%f, %f, %f, %f]\n", z[0], z[1], z[2], z[3]);
//printf("used performance counter:%u\n", t2.QuadPart - t1.QuadPart);
// test 2......
QueryPerformanceCounter(&t1);
for(i = 0; i < COMPUTE_TIMES; i ++){
_asm{
movaps xmm0, x
addps xmm0, y
movaps z, xmm0
}
/* z = x*x+y*y+0.5
_asm{
movaps xmm0, x
mulps xmm0, xmm0
movaps xmm1, y
mulps xmm1, xmm1
addps xmm0, xmm1
movaps xmm1, c
addps xmm0, xmm1
movaps z, xmm0
}
*/
}
QueryPerformanceCounter(&t2);
tav2 += (t2.QuadPart - t1.QuadPart);
//printf("x[%f, %f, %f, %f]\n", x[0], x[1], x[2], x[3]);
//printf("y[%f, %f, %f, %f]\n", y[0], y[1], y[2], y[3]);
//printf("z[%f, %f, %f, %f]\n", z[0], z[1], z[2], z[3]);
//printf("used performance counter:%u\n", t2.QuadPart - t1.QuadPart);
}
printf("test 1 average performance counter:%u\n", tav1/TEST_TIMES);
printf("test 2 average performance counter:%u\n", tav2/TEST_TIMES);
return 0;
}
//~end of file |
|