Frage

Ich lese eine Frage zu c # Code-Optimierung und eine Lösung c ++ mit SSE zu verwenden. Ist es möglich, SSE direkt von einem c # Programm zu tun?

War es hilfreich?

Lösung

Der kommend Mono 2.2 Release wird SIMD-Unterstützung. Miguel de Icaza gebloggt über die bevorstehende Funktion hier und die API ist < a href = "http://go-mono.com/docs/index.aspx?tlink=0@N%3aMono.Simd" rel = "noreferrer"> hier .

Auch wenn es eine Bibliothek, die Entwicklung unter Microsoft .NET-Windows-Runtime unterstützen wird, wird es nicht die Leistungsvorteile, die Sie suchen, es sei denn, Sie den Code unter der Mono-Laufzeit ausgeführt werden. Welche je nach Ihren persönlichen Umständen könnte machbar sein.

Update: Mono 2.2 ist freigegeben

Andere Tipps

Kann C # explizit einen SSE-Anruf?

Nein. C # nicht produziert inline IL viel weniger inline x86 / amd64 Montag.

Die CLR und insbesondere der JIT wird SSE verwenden, wenn er die Beseitigung der Notwendigkeit zu zwingen, es in den meisten Fällen zur Verfügung steht. Ich sage die meisten, weil ich nicht ein SSE-Experte bin, und ich bin sicher, dass es Fälle gibt, in denen es von Vorteil sein könnte, und der JIT nicht die Optimierung machen.

SIMD für .NET zur Verfügung in der nahen Zukunft sein. RyuJIT (die nächste Generation der JIT-Compiler für .NET) für diese Funktion ATM erforderlich.

Sie sollten Microsoft.Numerics.Vectors.Vector<T> Klasse von Microsoft.Bcl.Simd Paket verwenden nehmen Vorteil dieser Funktion. Beispielcode hier .

Basierend auf dieses Beitrag im Forum, verwendet die MS JIT-Compiler automatisch SSE wenn SSE auf der Zielmaschine vorhanden ist.

Wenn Sie einen ‚Brocken‘ von Arbeit haben Sie tun möchten, ist die beste Wette es in C ++ schreiben die MMX / SSE-Spezifika und anschließend eine sehr einfache / clr Managed C ++ Klasse, die Ihre Funktionalität wickelt und setzt es out als .net-Klasse. Dann können Sie den Code genau das Assembly verwenden, als ob es sich um eine normale Klasse waren.

Für mehr über die VC-Spezifika Sie in diesem kleinen Liedchen aussehen kann ich vor vielen Jahren geschrieben haben.

http://msdn.microsoft.com/en-us/library /0aws1s9k.aspx

Oh - ich nehme an, Sie eigentlich wollen, sind die parallelen Funktionen nutzen, um etwas zu beschleunigen. Wie andere haben darauf hingewiesen -. Wenn Sie nur Daten in größeren Brocken bewegen wollen und dergleichen, bereits die JIT-weiß, wie für die Grundlagen SSE verwenden

Filip ist richtig. Ich habe eine andere, ältere Post ein ähnliches, aber detailliertere Beispiel zeigt. Ich habe laufen tatsächlich diesen Code, und modifiziert es mich selbst zu beweisen, dass es funktioniert. Ich betrachtete diese Technik in einem Projekt mit Ich arbeite und deshalb habe ich aus bin auf der Suche, um zu sehen, was neu sein kann, da dies ein wenig alt ist. Wie der Autor schon sagt, können Sie eine beliebige Funktion schreiben Sie in C ++ möchten, kompilieren, dann die Bytes in C # kopieren.

http://blogs.msdn.com/ b / devinj / Archiv / 2005/07/12 / 438323.aspx

Ich möchte hinzufügen, dass Joes CLI C ++ Klasse eine gute Idee, wie gut ist, aber ich glaube nicht, das sse Compiler-Flag und die / clr Flagge am selben Projekt kompatibel sind. Ich habe gerade festgestellt, dass: Ihren hohen perf-Code in einem separaten Projekt zu schreiben, die SSE zu verwenden (/ arch: sse oder / arch: SSE2) Compiler-Flag as / clr incomatible ist. Um etwas viel komplexer als nicht einfache Arithmetik auf wenige Eingänge, ich denke, das ist der beste Ansatz.

Vor kurzem hat Microsoft eine Beta-SIMD-Vektorbibliothek veröffentlicht ( Microsoft.Bcl.Simd ) für C #, die erfordert die Installation des RyuJIT CTP und funktioniert nur Windows 8.

Sie können auch verwendet nur eine native SSE-Bibliothek und rufen Sie es aus C #. Zum Beispiel der Yeppp Bibliothek finden Sie unter diese Stackoverflow beantworten .

Natürlich können Sie (die wichtigere Frage ist - warum sollte man Lass es einfach auf die Laufzeit,? Das ist seine Aufgabe).

C # können Sie einen Delegaten auf eine Speicheradresse zuordnen. Das Speicheradresse kann roh Montagecodes enthalten. Sie können mehr über Michael Giagnocavo Blog lesen .

Auch wenn ich mich nicht versucht haben, kann es möglich sein a href zu verwenden <= „http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.getdelegateforfunctionpointer.aspx“ rel = "nofollow noreferrer"> Marshal.GetDelegateForFunctionPointer auch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top