PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SSE2 Code für x^y mit doubles


ScottManDeath
2005-01-13, 01:45:20
Suche Code (C++/MASM/Inline Assembler) für x^y um mit SSE2 2 doubles parallel zu verarbeiten.

Exponenten sind positiv, es muss also keine allgemeingültige Lösung sein. Dummerweise gibt es bei SSE2 keine Befehle für e^x / ln x, sonst hätte ich mir das schon selbst zusammengeschraddelt ;)

Trap
2005-01-13, 14:23:03
Exponenten positiv bringt fast nix: x^(-y)=1/(x^y) , das ist in 1 Befehl erledigt.

Sonst kann ich dir leider nicht weiterhelfen.

Xero
2005-01-13, 15:38:21
schon in die Approximate Math library von Intel geschaut ?

http://developer.intel.com/design/pentiumiii/devtools/AMaths.zip

(source code dabei)

ScottManDeath
2005-01-13, 16:21:46
:ulove3:

Das ist genau das was ich gesucht habe. Ich hab zwar die Intel Seite durchstöbert, das einzige was ich gefunden habe war ein Artikel zur Implementation von transzendenten Funktionen für den Itanium ;)


Jetzt kann ich endlich machen das es noch schneller wird :D

DocEW
2005-01-13, 18:58:50
Daß WAS noch schneller wird? ;)

ScottManDeath
2005-01-14, 01:52:50
So, ich hab mir die Intel lib mal angesehen, es ist das was ich suche, allerdings mit dem Haken dass es nur für 4x32 Bit Float ist, ich es aber für 2x64 Bit Float (== double) benötige. Da der Source Code dabei ist werde ich mal sehen ob ich den Code anpassen kann. Trotzdem thx!

Ich habe folgendes Matlab-Script welches zu langsam ist und als C++ Dll kompiliert werden sollte. Es bestimmt die Distanz von einem Vektor zu mehreren anderen, allerdings nicht (nur) die Euklidische ( d² = |a-b|² ) sondern auch für beliebige Exponenten ( die Wurzel von der Distanzsumme wird eingespart, da beim Vergleich einfach die andere Seite "hochgenommen" ;) wird).
Wenn ich das Ganze mit der FPU löse, habe ich ca 20% Laufzeit. Ich habe das dann noch mit SSE2 gemacht, und komme im Spitzenfall auf 10% gegenüber der Matlab Version. Allerdings muss ich auch für die pow Funktion auf die FPU zurückgreifen. Für gängige, ganzzahlige Exponenten habe ich pow durch Multiplikation, und damit reinem SSE2 Code ersetzt. Jetzt wollte ich noch für die allgemeinen Fälle pow durch SSE2 pow ersetzen, damit ich die FPU los werde indem ich 2 mal pow parallel rechne.


function distances = DistanceVector( neuron_matrix, input_vector, exponent)
[num_neurons dimension]= size(neuron_matrix);
if size(input_vector,1) ~= 1
error('input_vector rows != 1');
end
if size(input_vector,2) ~= dimension
error('dimension mismatch');
end
distances = zeros(num_neurons,1);
for cur_neuron = 1: num_neurons
difference = abs( neuron_matrix(cur_neuron,:) - input_vector(1,:) );
distances(cur_neuron) = sum (difference .^ exponent) ;
end

Plasmafusion
2005-01-20, 04:56:45
Benutzt eigentlich der Visual Studio 2005 (Beta 2) C++ Compiler SSE2/3 bei Standard Windows-Programmen ? Also ein bißchen GUI, ein bißchen Threads, etwas file I/O und etwas Netcode.

ScottManDeath
2005-01-20, 22:32:13
Keine Ahnung, aber das Visual Studio 2003 nutzt SSE2 wenn man als Compileroption /arch:SSE2 angibt. Dann versucht er automatisch zu vektorisieren & co. Ausserdem nutzt die C/C++ Runtime SSE2 für mathematische Funktionen wie z.B. pow, aber nur wenn die CPU das unterstützt. Kann man mit der _set_sse2_enable(int) Funktion an/abschalten.

Coda
2005-01-21, 09:42:08
Benutzt eigentlich der Visual Studio 2005 (Beta 2) C++ Compiler SSE2/3 bei Standard Windows-Programmen ? Also ein bißchen GUI, ein bißchen Threads, etwas file I/O und etwas Netcode.Ja. Aber da wäre es leicht sinnlos das einzustellen.