2640

tongue

2641

[19:18:30] <Zerosquare> bon allez zou, je vais passer un coup de balai
[19:19:13] <Folco> tu vas pas me dire que t'as pas un script pour ça ?
[19:19:22] <Zerosquare> non
[...]
[19:21:07] <Folco> Je parlais d'un script "CoupDeBalai.sh" :D
[19:21:14] <Zerosquare> ^^
[19:21:33] <Zerosquare> ça serait bien, mais j'arrive déjà pas à avoir une fonction "aligner le bordel sur la grille" dans ma chambre :(

2642

2643

bearbecue :
	while (sCount--)
	{
		__m128	xmm2 = _mm_load_ps(data + 0x0);
		__m128	xmm3 = _mm_load_ps(data + 0x4);
		__m128	xmm4 = _mm_load_ps(data + 0x8);
		__m128	xmm5 = _mm_load_ps(data + 0xC);
		xmin = _mm_min_ps(xmin, xmm2);
		xmax = _mm_max_ps(xmax, xmm2);
		xmin = _mm_min_ps(xmin, xmm3);
		xmax = _mm_max_ps(xmax, xmm3);
		xmin = _mm_min_ps(xmin, xmm4);
		xmax = _mm_max_ps(xmax, xmm4);
		xmin = _mm_min_ps(xmin, xmm5);
		xmax = _mm_max_ps(xmax, xmm5);
		data += 0x10;
	}

Visual Studio 2010 :
01794BA0 0F 5D 00             minps       xmm0,xmmword ptr [eax]  
01794BA3 0F 5F 08             maxps       xmm1,xmmword ptr [eax]  
01794BA6 0F 5D 40 10          minps       xmm0,xmmword ptr [eax+10h]  
01794BAA 0F 5F 48 10          maxps       xmm1,xmmword ptr [eax+10h]  
01794BAE 0F 5D 40 20          minps       xmm0,xmmword ptr [eax+20h]  
01794BB2 0F 5F 48 20          maxps       xmm1,xmmword ptr [eax+20h]  
01794BB6 0F 5D 40 30          minps       xmm0,xmmword ptr [eax+30h]  
01794BBA 0F 5F 48 30          maxps       xmm1,xmmword ptr [eax+30h]  
01794BBE 83 C0 40             add         eax,40h  
01794BC1 49                   dec         ecx  
01794BC2 75 DC                jne         HellHeaven:: SIMD_SSE::FindMinMaxFloat4Stream_Aligned16+20h (1794BA0h)


mais.. mais... mais... RHAAAAAAAAAA mais NON ! putain de... !!! angry angry angry
avatar
HURRRR !

2644

Pour les demeurés étant des informaticiens-usurpateurs, on peut avoir une explications ? cheeky
avatar

2645

On dirait de l’ASM en deuxième partie.

2646

Ben c'est sûr que c'est pas du lisp cheeky


Je suppose que le code généré suxe. En tout cas il n'a pas l'air de coller de très près au code C++ au dessus.

2647

le code généré suxe car il charge plusieurs fois la même info de la RAM qui doit ramer, au lieu de le mettre dans un registre temporaire?

d'ailleurs visual studio semble n'utiliser que deux registres xmm0 et xmm1 alors que bear essaye de lui en faire utiliser plus grin

ou alors il multiplie tous les offsets par 4? grin (ptet normal ça, je connais pas le type de "data")

2648

ah c'est ça le xmmword ptr [eax+30h] ?
eax serait le registre d'adresse, 30h un décalage et xmmword... ?

edit : ah OK, xmm est un registre, et le word est pour la taille des données... cheeky

2649

ouai, ce que dit squalyl.

Pen^2> pour les load/stores, t'as differents tags qui donnent la taille de l'operande memoire, genre byte ptr (8bits), word ptr (16bits), dword ptr (32bits), qword ptr (64bits), et xmmword ptr (128bits)

et, ouai, ce sale con, il passe tout en operandes memoires plutot que de faire des loads separes.
non seulement ca loade deux fois les donnees, MAIS surtout, il y a un stall A CHAQUE PUTAIN D'INSTRUCTION !!! vu que les minps/maxps sont obliges d'attendre que le load se fasse.. alors qu'avec les intrinsics SSE du code d'origine, visual a tout le taff deja mache, et les loads sont fait avant l'utilisation de leur resultats, ca stall quand meme un peu, mais nettement moins...
avatar
HURRRR !

2650

super.. en recodant ca a la main en asm inline:
bearbecue :
	__asm
	{
		[...]

		cmp	eax, ecx
		jg	_SkipUnrolled
_LoopUnrolled:
		movaps	xmm0, [eax]
		movaps	xmm1, [eax + 0x10]
		movaps	xmm2, [eax + 0x20]
		movaps	xmm3, [eax + 0x30]

		minps	xmm6, xmm0
		maxps	xmm7, xmm0
		add	eax, 64
		minps	xmm6, xmm1
		maxps	xmm7, xmm1
		cmp	eax, ecx
		minps	xmm6, xmm2
		maxps	xmm7, xmm2
		minps	xmm6, xmm3
		maxps	xmm7, xmm3

		jbe	_LoopUnrolled
_SkipUnrolled:
		[...]
	}


comme c'est etonnant... * 3 en perfs woohoo \o/

putain de compilateur de merde...

squalyl> les offsets * 4, c'est normal, c'est des floats
avatar
HURRRR !

2651

happy

(merci)

2652

et encore mieux, en utilisant xmm4/5 pour eviter une dependance toutes les deux instructions entre les minps/maxps:
	__asm
	{
		mov		eax, streamAligned16
		mov		ebx, count

		movaps	xmm4, [eax]
		add		ebx, ebx
		movaps	xmm5, xmm4
		movaps	xmm6, xmm4
		movaps	xmm7, xmm4
		lea		ebx, [eax + ebx * 8]	// end = stream + count*16
		add		eax, 16
		lea		ecx, [ebx - 64]

		cmp		eax, ecx
		jg		_SkipUnrolled
_LoopUnrolled:
		movaps	xmm0, [eax]
		movaps	xmm1, [eax + 0x10]
		movaps	xmm2, [eax + 0x20]
		movaps	xmm3, [eax + 0x30]

		minps	xmm4, xmm0		// <--
		maxps	xmm5, xmm0		// <--
		add		eax, 64
		minps	xmm6, xmm1
		maxps	xmm7, xmm1
		cmp		eax, ecx
		minps	xmm4, xmm2		// <--
		maxps	xmm5, xmm2		// <--
		minps	xmm6, xmm3
		maxps	xmm7, xmm3

		jbe		_LoopUnrolled


entre 3.5 et 4 * plus rapide que la daube compilee par visual... pfff
avatar
HURRRR !

2653

Ca fait quoi dans les meilleures quotes, sauf ton respect ?
avatar
"- Nigga you know what the fuck I want, nigga: I want your motherfuckin' Daytons, and your motherfuckin' stereo! And I'll take a double burger with cheese!
- WHUT?"
I LOVE TO HATE/I HATE YOUR LOVE -AND I CAN'T FEEL AFFECTION FOR PEOPLE LIKE YOU!
CAALGOOONNNNN [TELLMESOMETHINGIDONTKNOW SHOWMESOMETHINGICANTUSE PUSHTHEBUTTONS CONNECTTHEGODDAMNDOTS] (Si Dieu existe il doit me détester...)

2654

bah c'est une citation de bearbecue, c'est marqué pourtant embarrassed

2655

a la base c'est cense etre une citation de visual studio cheeky (et ca a degenere vers des explications plus detaillees, stou)
avatar
HURRRR !

2656

Tout ça, c'est encore à cause de Nil ! Il n'en rate pas une celui-là embarrassed

2657

D'accord mais je comprends pas ce qui est drôle ou intéressant.
avatar
"- Nigga you know what the fuck I want, nigga: I want your motherfuckin' Daytons, and your motherfuckin' stereo! And I'll take a double burger with cheese!
- WHUT?"
I LOVE TO HATE/I HATE YOUR LOVE -AND I CAN'T FEEL AFFECTION FOR PEOPLE LIKE YOU!
CAALGOOONNNNN [TELLMESOMETHINGIDONTKNOW SHOWMESOMETHINGICANTUSE PUSHTHEBUTTONS CONNECTTHEGODDAMNDOTS] (Si Dieu existe il doit me détester...)

2658

ce qui est drole c'est la debilite extreme de ce qui est quote...

oh bon, tant pis embarrassed
avatar
HURRRR !

2659

Rappelle-toi que je ne sais pas coder, et que si on commence à mettre ça ici ça va méchamment détourner.
avatar
"- Nigga you know what the fuck I want, nigga: I want your motherfuckin' Daytons, and your motherfuckin' stereo! And I'll take a double burger with cheese!
- WHUT?"
I LOVE TO HATE/I HATE YOUR LOVE -AND I CAN'T FEEL AFFECTION FOR PEOPLE LIKE YOU!
CAALGOOONNNNN [TELLMESOMETHINGIDONTKNOW SHOWMESOMETHINGICANTUSE PUSHTHEBUTTONS CONNECTTHEGODDAMNDOTS] (Si Dieu existe il doit me détester...)

2660

bear : "Le compilateur optimisera mieux que toi, qu'ils disaient" (bis) tongue

Ceci dit ça n'a pas sa place dans les meilleures quotes, en effet.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

2661

Je propose de voter !

2662

heu stuveux grin
avatar
HURRRR !

2663

[sondage=16414]

2664

triso
avatar
HURRRR !

2665

Et surtout, on pourrait revenir au sujet, merci

2666

./2660 Zerosquare :Le compilateur optimisera mieux que toi, qu'ils disaient
avatar
HURRRR !

2667

À votre avis ?
The best optimizer is between your ears


(vinceEnRouge> OK, OK embarrassed)

2668

belle culture Pen^2 love
avatar
HURRRR !

2669

Bizarre, j'aurais pensé que le cache aurait fait son effet et que la deuxième lecture n'aurait pas eu d'inpact (sauf si la ligne se fait désactiver par une écriture en copy-back) et que les offsets à 10h, 20h, 30h soient là pour l'alignement mémoire optimal...

Burp !

Kochise
avatar
Si Dieu m'a de nouveau fait homme, cette fois il m'a pas raté : marcher sur l'eau et dupliquer les pains, ça marche p'us :/

2670

[offtopic]
Kochise>
ah ben encore heureux que le cache fasse son effet.. t'as une idee du cout en cycles d'un cache-miss, meme sur le L1? grin
le probleme c'est que c'est quand meme un acces memoire, et meme si c'est deja en L1, tu te farcis un stall systematique, meme si tu loade 20 fois la meme adresse
et je suis pas sur de savoir de quoi tu parle en disant ecriture en copy-back ? tu parle d'un load-hit-store, ou de si le cache se fait invalider par un autre core qui ecrit a la meme adresse / a une adresse qui se fait mapper dans la meme banque du cache?
(enfin dans le premier cas, yen a pas, et dans le second, faudrait quand meme le faire expres pour que ca arrive en synchro avec les iterations de la boucle grin (et l'impact serait autrement plus important))

et heu, ouai, les offsets 10h,20h,30h, c'est parceque c'est un float4 qui est loade, donc 16 octets a la fois, ca c'est rien de particulier, c'est dans le code d'origine de toutes facons, et oui la memoire est alignee, sinon ca serait des movups au lieu de movaps (meme si en pratique la difference de perfs entre les deux est assez negligeable sur les CPU recents)

bref la le gros probleme c'est que l'acces memoire produit un stall du pipeline d'execution a chaque instruction, cache ou pas cache.
(btw, vu que tu parle de cache, dans le cas concret de cette boucle, ca sert a rien de prefectch manuellement, vu que le pattern d'acces a la memoire est tres previsible (totalement lineaire, avec les memes offsets a chaque fois, et une cache-line par boucle), l'auto-prefetch du cpu fonctionne mieux que les prefetch manuels)
[/offtopic]
avatar
HURRRR !