我正在做一些SSE代碼(將4個浮點數乘以4個浮點數)與傳統C代碼做同樣的事情。我認爲我的基準測試代碼在某種程度上必須是不正確的,因爲它似乎認爲非SSE代碼比SSE快2-3倍。對標SSE指令
有人能告訴我下面的基準代碼有什麼問題嗎?也許會提出另一種準確顯示SSE和非SSE代碼速度的方法。
#include <time.h>
#include <string.h>
#include <stdio.h>
#define ITERATIONS 100000
#define MULT_FLOAT4(X, Y) ({ \
asm volatile (\
"movaps (%0), %%xmm0\n\t" \
"mulps (%1), %%xmm0\n\t" \
"movaps %%xmm0, (%1)" \
:: "r" (X), "r" (Y)); })
int main(void)
{
int i, j;
float a[4] __attribute__((aligned(16))) = { 10, 20, 30, 40 };
time_t timer, sse_time, std_time;
timer = time(NULL);
for(j = 0; j < 5000; ++j)
for(i = 0; i < ITERATIONS; ++i) {
float b[4] __attribute__((aligned(16))) = { 0.1, 0.1, 0.1, 0.1 };
MULT_FLOAT4(a, b);
}
sse_time = time(NULL) - timer;
timer = time(NULL);
for(j = 0; j < 5000; ++j)
for(i = 0; i < ITERATIONS; ++i) {
float b[4] __attribute__((aligned(16))) = { 0.1, 0.1, 0.1, 0.1 };
b[0] *= a[0];
b[1] *= a[1];
b[2] *= a[2];
b[3] *= a[3];
}
std_time = time(NULL) - timer;
printf("sse_time %d\nstd_time %d\n", sse_time, std_time);
return 0;
}
感謝您的回答。 :)但是,我真的需要一個使用SSE進行圖像處理的非常快速的4浮點乘法器。如果我使用的方法存在缺陷,您能否提出另一種方法來利用SSE的力量,但不會導致這種減速。我讀過SSE實際上是爲我想到的那種圖像處理而設計的,所以肯定必須成爲我想要的方式嗎? (我需要像alpha混合等操作的快速4float倍數) – horseyguy 2009-11-14 16:22:15
我已更新帖子以包含答案。 – ypsu 2009-11-14 17:08:40
謝謝,不好看起來'商店轉發攤位',並試圖包裹我的頭在這裏發生了什麼 – horseyguy 2009-11-14 17:32:02