URL: https://linuxfr.org/users/nl/journaux/optimisation-de-code-c Title: Optimisation de code C Authors: Nicolas LAURENT Date: 2004年08月19日T15:36:45+02:00 Tags: Score: 0 Bonjour, je cherche à ecrire en C une routine optimisée pour calculer un produit scalaire de deux vecteurs (de taille variable). Comme cette routine sera appelée plusieurs milliers (millions) de fois, je cherche à gagner le moindre cycle processeurs. Ma plate-forme est un athlon-XP (sans SSE2 donc). Pour l'instant j'ai 2 variantes: C-pure: double dot(const double *a, const double *b, unsigned long n) { £spaces£ £/spaces£register double res=0.0; £spaces£ £/spaces£register unsigned long i; £spaces£ £/spaces£ £spaces£ £/spaces£for(i=(n/4)*4; i != 0; i -= 4) £spaces£ £/spaces£{ £spaces£ £/spaces£register const double res1=a[i] * b[i]; £spaces£ £/spaces£register const double res2=a[i+1] * b[i+1]; £spaces£ £/spaces£register const double res3=a[i+2] * b[i+2]; £spaces£ £/spaces£register const double res4=a[i+3] * b[i+3]; £spaces£ £/spaces£res += res1 + res2 + res3 +res4; £spaces£ £/spaces£} £spaces£ £/spaces£ £spaces£ £/spaces£switch(n-i) £spaces£ £/spaces£{ £spaces£ £/spaces£case 3: res += a[n-3] * b[n-3]; £spaces£ £/spaces£case 2: res += a[n-2] * b[n-2]; £spaces£ £/spaces£case 1: res += a[n-1] * b[n-1]; £spaces£ £/spaces£} £spaces£ £/spaces£return(res); } et une C/Asm (plus rapide) double dot(const double *a, const double *b, unsigned long n) { £spaces£ £/spaces£double res; £spaces£ £/spaces£ £spaces£ £/spaces£__asm__ __volatile__ ("fldz\n\t" £spaces£ £/spaces£"testl %1, %1\n\t" £spaces£ £/spaces£"jbe .fem.dot.end\n" £spaces£ £/spaces£".fem.dot.loop:\n\t" £spaces£ £/spaces£"subl 1,ドル %1\n\t" # ifdef SSE £spaces£ £/spaces£/* £spaces£ £/spaces£* Theses 2 instructions do all the job! £spaces£ £/spaces£* Whithout them, we get "only" 17% speedup £spaces£ £/spaces£* note: 128 is an empirical value... £spaces£ £/spaces£*/ £spaces£ £/spaces£"prefetcht2 -128(%3, %1, 8)\n\t" £spaces£ £/spaces£"prefetcht2 -128(%2, %1, 8)\n\t" # endif /* SSE */ £spaces£ £/spaces£"fldl (%3, %1, 8)\n\t" £spaces£ £/spaces£"fmull (%2, %1, 8)\n\t" £spaces£ £/spaces£"faddp %0, %0(1)\n\t" £spaces£ £/spaces£"jne .fem.dot.loop\n" £spaces£ £/spaces£".fem.dot.end:" £spaces£ £/spaces£: "=%%st" (res) £spaces£ £/spaces£: "q" (n) , "q" (a), "q" (b)); £spaces£ £/spaces£return(res); } Si il y a des grourous de l'optimisation de code, j'aimerai avoir vos avis! Merci ps. j'ai tester blas et atlas sans succès.

AltStyle によって変換されたページ (->オリジナル) /