[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
sgemm PIII timings.
Hello everybody.
I tried to do a parameter search with my code generator on a 550 mhz PIII,
and I got a result of 940 mflops for mu=4 nu=1 ku=56 and nb=56, so a fully
unrolled k-loop. With moves="", that is no L2 cache flushing, I get 1080
mflops.
I have attached the code, it needs the include file I posted earlier.
Cheers,
Peter.
#define SSE
#include "SSE3Dnow.h"
void ATL_USERMM
(const int M, const int N, const int K, const float alpha, const float *A, const int lda, const float *B, const int ldb, const float beta, float *C, const int ldc)
{
/*--- achitecture specific declarations ---*/
/*--- program specific declarations ---*/
int i, j, k;
vector betavec;
const float *pA0 = A;
const float *pB0 = B;
float *pC0 = C;
const float *stM = A + MB*KB;
const float *stN = B + NB*KB;
const int incAm = 4*KB-KB;
const int incBm = -KB;
const int incCm = 4;
const int incAn = -MB*KB;
const int incBn = 1*KB;
const int incCn = ldc*1-MB;
/*--- initial arhitecture specific statements ---*/
vec_enter();
/*--- main program statements ---*/
vec_load_one(&beta,reg0);
vec_mov_rm(reg0,&betavec);
do /* N-loop */
{
do /* M-loop */
{
#ifdef BETA0
vec_zero(reg0);
vec_zero(reg1);
vec_zero(reg2);
vec_zero(reg3);
#elif defined(BETA1)
vec_load_one(pC0,reg0);
vec_load_one(pC0+1,reg1);
vec_load_one(pC0+2,reg2);
vec_load_one(pC0+3,reg3);
#else
vec_mov_mr(betavec,reg7);
vec_load_one(pC0,reg0);
vec_mul_rr(reg7,reg0);
vec_load_one(pC0+1,reg1);
vec_mul_rr(reg7,reg1);
vec_load_one(pC0+2,reg2);
vec_mul_rr(reg7,reg2);
vec_load_one(pC0+3,reg3);
vec_mul_rr(reg7,reg3);
#endif
vec_mov_mr_a(pB0,reg5);
vec_mov_mr_a(pA0,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg0);
vec_mov_mr_a(pA0+KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg1);
vec_mov_mr_a(pA0+2*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg2);
vec_mov_mr_a(pA0+3*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_mov_mr_a(pB0+4,reg5);
vec_add_rr(reg4,reg3);
vec_mov_mr_a(pA0+4,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg0);
vec_mov_mr_a(pA0+4+KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg1);
vec_mov_mr_a(pA0+4+2*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg2);
vec_mov_mr_a(pA0+4+3*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_mov_mr_a(pB0+8,reg5);
vec_add_rr(reg4,reg3);
vec_mov_mr_a(pA0+8,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg0);
vec_mov_mr_a(pA0+8+KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg1);
vec_mov_mr_a(pA0+8+2*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg2);
vec_mov_mr_a(pA0+8+3*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_mov_mr_a(pB0+12,reg5);
vec_add_rr(reg4,reg3);
vec_mov_mr_a(pA0+12,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg0);
vec_mov_mr_a(pA0+12+KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg1);
vec_mov_mr_a(pA0+12+2*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg2);
vec_mov_mr_a(pA0+12+3*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_mov_mr_a(pB0+16,reg5);
vec_add_rr(reg4,reg3);
vec_mov_mr_a(pA0+16,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg0);
vec_mov_mr_a(pA0+16+KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg1);
vec_mov_mr_a(pA0+16+2*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg2);
vec_mov_mr_a(pA0+16+3*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_mov_mr_a(pB0+20,reg5);
vec_add_rr(reg4,reg3);
vec_mov_mr_a(pA0+20,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg0);
vec_mov_mr_a(pA0+20+KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg1);
vec_mov_mr_a(pA0+20+2*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg2);
vec_mov_mr_a(pA0+20+3*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_mov_mr_a(pB0+24,reg5);
vec_add_rr(reg4,reg3);
vec_mov_mr_a(pA0+24,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg0);
vec_mov_mr_a(pA0+24+KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg1);
vec_mov_mr_a(pA0+24+2*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg2);
vec_mov_mr_a(pA0+24+3*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_mov_mr_a(pB0+28,reg5);
vec_add_rr(reg4,reg3);
vec_mov_mr_a(pA0+28,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg0);
vec_mov_mr_a(pA0+28+KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg1);
vec_mov_mr_a(pA0+28+2*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg2);
vec_mov_mr_a(pA0+28+3*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_mov_mr_a(pB0+32,reg5);
vec_add_rr(reg4,reg3);
vec_mov_mr_a(pA0+32,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg0);
vec_mov_mr_a(pA0+32+KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg1);
vec_mov_mr_a(pA0+32+2*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg2);
vec_mov_mr_a(pA0+32+3*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_mov_mr_a(pB0+36,reg5);
vec_add_rr(reg4,reg3);
vec_mov_mr_a(pA0+36,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg0);
vec_mov_mr_a(pA0+36+KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg1);
vec_mov_mr_a(pA0+36+2*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg2);
vec_mov_mr_a(pA0+36+3*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_mov_mr_a(pB0+40,reg5);
vec_add_rr(reg4,reg3);
vec_mov_mr_a(pA0+40,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg0);
vec_mov_mr_a(pA0+40+KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg1);
vec_mov_mr_a(pA0+40+2*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg2);
vec_mov_mr_a(pA0+40+3*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_mov_mr_a(pB0+44,reg5);
vec_add_rr(reg4,reg3);
vec_mov_mr_a(pA0+44,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg0);
vec_mov_mr_a(pA0+44+KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg1);
vec_mov_mr_a(pA0+44+2*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg2);
vec_mov_mr_a(pA0+44+3*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_mov_mr_a(pB0+48,reg5);
vec_add_rr(reg4,reg3);
vec_mov_mr_a(pA0+48,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg0);
vec_mov_mr_a(pA0+48+KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg1);
vec_mov_mr_a(pA0+48+2*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg2);
vec_mov_mr_a(pA0+48+3*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_mov_mr_a(pB0+52,reg5);
vec_add_rr(reg4,reg3);
vec_mov_mr_a(pA0+52,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg0);
vec_mov_mr_a(pA0+52+KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg1);
vec_mov_mr_a(pA0+52+2*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg2);
vec_mov_mr_a(pA0+52+3*KB,reg4);
vec_mul_rr(reg5,reg4);
vec_add_rr(reg4,reg3);
pA0 += 56;
pB0 += 56;
vec_sum(reg0);
vec_sum(reg1);
vec_sum(reg2);
vec_sum(reg3);
vec_store_one(reg0,pC0);
vec_store_one(reg1,pC0+1);
vec_store_one(reg2,pC0+2);
vec_store_one(reg3,pC0+3);
pA0 += incAm;
pB0 += incBm;
pC0 += incCm;
}
while(pA0 != stM);
pA0 += incAn;
pB0 += incBn;
pC0 += incCn;
}
while(pB0 != stN);
vec_exit();
/*--- standard architecture cleanup ---*/
}