Torna indietro   Hardware Upgrade Forum > Software > Programmazione

NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT
NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT
Nelle ultime settimane abbiamo provato tre delle proposte top di gamma di NZXT nelle categorie case, dissipatori e ventole. Rispettivamente, parliamo dell'H9 Flow RGB+, Kraken Elite 420 e F140X. Si tratta, chiaramente, di prodotti di fascia alta che si rivolgono agli utenti DIY che desiderano il massimo per la propria build. Tuttavia, mentre i primi due dispositivi mantengono questa direzione, le ventole purtroppo hanno mostrato qualche tallone d'Achille di troppo
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN è il primo monitor gaming con pannello QD-OLED Gen 5 a layout RGB Stripe Pixel e 360 Hz su 34 pollici: lo abbiamo misurato con sonde colorimetriche e NVIDIA LDAT. Ecco tutti i dati
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Nothing Phone (4a) Pro cambia pelle: l'alluminio unibody sostituisce la trasparenza integrale, portando una solidità inedita. Sotto il cofano troviamo uno Snapdragon 7 Gen 4 che spinge forte, mentre il display è quasi da top dig amma. Con un teleobiettivo 3.5x e la Glyph Matrix evoluta, è la prova di maturità di Carl Pei. C'è qualche compromesso, ma a 499EUR la sostanza hardware e la sua unicità lo rendono un buon "flagship killer" in salsa 2026
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 15-09-2008, 23:17   #1
ercand
Member
 
Iscritto dal: Sep 2004
Messaggi: 216
[asm e c++] Come far ritornare un parametro ? (naked function)

Salve a tutti, sto cercando di scrivere una classe che sfrutte le sse così da velocizzare il tutto, questa è la classe
Codice:
class Vector4
{
	public:
		__forceinline Vector4();
		__forceinline Vector4(const Vector4& v);
		__forceinline Vector4(const float* vec);

		// Operatori unari
		__forceinline Vector4 operator - ();

		// Operatori binari
		Vector4 __cdecl operator + (Vector4& vec);

		__m128 vector;
};
questo è il metodo che mi da problemi, somma semplicemente vec con this->vector.
Il metodo è dichiarato come naked per evitare il codice di prolog e epilog che mi rende lentissimo il codice ( con lento intendo che scivere il metodo senza sse è più veloce )
Codice:
__declspec(naked) Vector4 __cdecl Vector4::operator +(Vector4& vec)
{
	__asm
	{
		// questo per le funzioni naked
		mov eax, dword ptr[esp + 12]
		mov ecx, dword ptr[esp + 4]		//  esp+4 primo parametro

		// somma
		movaps xmm0, xmmword ptr[eax]
		movaps xmm1, xmmword ptr[ecx]
		addps xmm0, xmm1
	}
}
questo è il main per testare la classe
Codice:
int _tmain(int argc, _TCHAR* argv[])
{
	Vector4 v1, v2, v3;
	
	v1 = v2 + v3;
	
	return 0;
}
Quello che non riesco a fare è far si che v1 assuma il risultato di xmm0, ci sto sbattendo la testa da tre giorni e non riesco a venirne fuori, qualcuno potrebbe darmi un indizio su come procedere.

Grazie mille

Per i moderatori, mi sono dimenticato di aggiungere il titolo della discussione dopo [asm e c++], se potete modificarlo aggiungete "Come far ritornare un parametro?", grazie.

Ultima modifica di ercand : 15-09-2008 alle 23:24. Motivo: sono fesso.
ercand è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2008, 01:27   #2
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Naked function...ti vuoi proprio fare male

Allora...il problema è che devi ritornare una nuova istanza di Vector4, non devi modificare il vettore contenuto nell'istanza puntata da this.
In pratica devi fare in modo che il risultato della somma venga messo in un nuovo vettore allocato nello stack. Purtroppo non mi ricordo la convenzione per poter ritornare al chiamate una struttura dati complessa (per i dati semplici si ritorna in eax).

Imho se cerchi le prestazioni non ti conviene usare l'operatore + perché questo impone di ritornare prima una nuova istanza di classe che poi mettiamo venga assegnata ad una terza variabile tramite l'operatore uguale.

v = v1 + v2;

Impone l'allocazione di un vettore temporaneo che poi verrà assegnato a v: lo spreco di tempo è notevole, prima per l'accesso al vettore temporaneo e poi per la copia del vettore temporaneo in v.
Imho ti conviene fare così:


Vector4 & add(Vector4 &v);

In questo modo avrai v1.add(v2)) che ti permetterà di portarti dietro il risultato di varie operazioni accumulandolo in v1.
L'implementazione in assembly sarà anche più semplice perché dovrai solo ritornare this in eax.

Potrai anche mettere in sequenza diverse operazioni:

v = v1.add(v2).multiply(v3);

Se avessi bisogno di una copia puoi sempre definire un metodo clone:

Vector4 clone()
{
Vector4 cloned(this);
return cloned;
}

Per questo metodo non ti conviene usare le naked function. In questo modo risolvi automaticamente due problemi in un colpo solo
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2008, 01:45   #3
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Ah...ovviamente servono anche il prologo e l'epilogo, in modo da mettere lo stack nella situazione iniziale per poter fare il ret A meno che tu non modifichi ebp, ma il ret serve sempre.

http://msdn.microsoft.com/en-us/libr...3a(VS.80).aspx
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2008, 14:58   #4
ercand
Member
 
Iscritto dal: Sep 2004
Messaggi: 216
Innanzi tutto grazie per la risposta, e grazie per aver corretto il titolo della discussione .

Quote:
Originariamente inviato da cionci Guarda i messaggi
Imho ti conviene fare così:


Vector4 & add(Vector4 &v);

In questo modo avrai v1.add(v2)) che ti permetterà di portarti dietro il risultato di varie operazioni accumulandolo in v1.
L'implementazione in assembly sarà anche più semplice perché dovrai solo ritornare this in eax.

In questo modo avrai v1.add(v2)) che ti permetterà di portarti dietro il risultato di varie operazioni accumulandolo in v1.
L'implementazione in assembly sarà anche più semplice perché dovrai solo ritornare this in eax.

Potrai anche mettere in sequenza diverse operazioni:

v = v1.add(v2).multiply(v3);
Venedo a quello che mi hai consigliato mi sorge questo dubbio, se faccio questa operazione

v = v1.add(v2)

v assumerà il valore data dalla somma v1+v2, ma anche v1 non assumera lo stesso valore ( visto che il metodo add è chiamato su un'istanza di v1 )?

Grazie
ercand è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2008, 15:16   #5
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Certo, anche v1 assumerà lo stesso valore. L'equivalente dell'operazione precedente in effetti sarebbe:

v = v1;
v.add(v2);

O in alternativa:

v = v1.clone().add(v2);

Visto che solitamente si applicano varie operazioni ad uno stesso vettore però torna comodo per fare operazioni successive:

v1.add(v2).add(v3);

Un'operazione di questo tipo sarebbe equivalente a:

v1 = v1 + v2 + v3;

operazione che genera ben due variabili temporanee e tre operazioni di copia.

Ultima modifica di cionci : 16-09-2008 alle 15:20.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2008, 21:09   #6
ercand
Member
 
Iscritto dal: Sep 2004
Messaggi: 216
Quindi mi consigli di mandare a quel paese le funzioni naked?
Visto che ci sono approfitto ulteriormente della tua disponibilità ; ho visto che ci sono le funzioni intrinsic a disposizione, io però non voglio utilizzare perchè vorrei capire da solo come sfruttare le sse, le funzioni intrinsic sono per caso dichiarate naked? lo chiedo perche vedendo il codice assembly dentro VS2008 non vedi la parte prolog/epilog ma probabilmente mi sbaglio.

Grazie
ercand è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abb...
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz ASUS ROG Swift OLED PG34WCDN recensione: il prim...
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico Recensione Nothing Phone (4a) Pro: finalmente in...
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro WoW: Midnight, Blizzard mette il primo, storico ...
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Anthropic ha un'AI che trova falle in Wi...
I 10 migliori sconti Amazon del weekend:...
Con un coupon scendono ancora: le super ...
Minimo storico per Samsung Galaxy S26 Ul...
Si è conclusa la missione lunare ...
EK Waterblock si arrende agli aumenti, i...
Geekbench si aggiorna: tutti i test con ...
Per la prima volta un computer quantisti...
Telecamere Reolink 4K su Amazon: Wi-Fi 6...
Anthropic vuole farsi i chip da sola? Co...
Il fondatore di Framework: il personal c...
JBL Live Flex 3 a 129€ su Amazon: ANC ad...
Come un uomo ha costruito un'azienda da ...
Multe fino a 400 euro anche se hai pagat...
Tapo lancia una valanga di offerte su Am...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 00:11.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v