Question

Je lisais une question sur l’optimisation du code c # et une solution consistait à utiliser c ++ avec SSE. Est-il possible de faire l'ESS directement à partir d'un programme c #?

Était-ce utile?

La solution

La prochaine version Mono 2.2 sera prise en charge par SIMD. Miguel de Icaza a publié un blog sur la fonctionnalité à venir ici , et l'API est < a href = "http://go-mono.com/docs/index.aspx?tlink=0@N%3aMono.Simd" rel = "noreferrer"> ici .

Bien qu'une bibliothèque prenne en charge le développement sous le runtime Windows de Microsoft .NET, elle n'aura pas les avantages de performance que vous recherchez, sauf si vous exécutez le code sous le runtime Mono. Ce qui pourrait être faisable selon votre situation.

Mise à jour: Mono 2.2 est publié

.

Autres conseils

C # peut-il explicitement passer un appel SSE?

Non. C # ne peut pas produire IL en ligne et encore moins un assemblage inline x86 / amd64.

Le CLR, et plus particulièrement le JIT, utilisera SSE s'il est disponible, éliminant ainsi le besoin de le forcer dans la plupart des cas. Je dis le plus parce que je ne suis pas un expert de l'ESS et je suis sûr qu'il y a des cas où cela pourrait être bénéfique et que l'EGC ne fait pas l'optimisation.

SIMD pour .NET sera disponible dans un avenir proche. RyuJIT (le compilateur JIT de nouvelle génération pour .NET) requis pour cette fonctionnalité ATM.

Vous devez utiliser Microsoft.Numerics.Vectors.Vector<T> la classe du package Microsoft.Bcl.Simd . pour profiter de cette fonctionnalité. Exemple de code ici .

Basé sur dans ce forum , le compilateur MS JIT utilise automatiquement SSE si celui-ci est disponible sur la machine cible.

Si vous souhaitez effectuer un "travail", le mieux est de l'écrire en C ++ à l'aide des éléments intrinsèques de MMX / SSE, puis de créer une classe C ++ très simple gérée par / clr qui enveloppe vos fonctionnalités et les expose. en tant que classe .net. Ensuite, votre code peut simplement utiliser cet assemblage comme s'il s'agissait d'une classe normale.

Pour en savoir plus sur les composants intrinsèques du VC, consultez cette petite phrase que j'ai écrite il y a de nombreuses années.

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

Oh, je suppose que vous voulez réellement utiliser les fonctions parallèles pour accélérer quelque chose. Comme d'autres l'ont fait remarquer, si vous souhaitez simplement déplacer des données par gros morceaux, le JIT sait déjà comment utiliser SSE pour ces bases.

Filip est correct. J'ai un autre article, plus ancien, montrant un exemple similaire, mais plus détaillé. En fait, j'ai exécuté ce code et je l'ai modifié moi-même pour me prouver que cela fonctionne. J'envisage d'utiliser cette technique dans le cadre d'un projet sur lequel je travaille. C'est pourquoi je cherche à voir ce qui peut être nouveau car il est un peu vieux. Comme l’implique l’auteur, vous pouvez écrire n’importe quelle fonction en C ++, la compiler, puis copier les octets dans votre C #.

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

J'ajouterais que la classe CLI C ++ de Joe est également une bonne idée, mais je ne pense pas que l'indicateur de compilation sse et l'indicateur / clr soient compatibles sur le même projet. Je viens de vérifier que: vous devez écrire votre code haute performance dans un projet séparé pour utiliser le drapeau de compilateur SSE (/ arch: sse ou / arch: sse2) car / clr est incomatible. Pour faire quelque chose de beaucoup plus complexe que de faire de l'arithmétique simple sur quelques entrées, je pense que c'est la meilleure approche.

Microsoft a récemment publié une bibliothèque de vecteurs SIMD bêta ( Microsoft.Bcl.Simd ) pour C # qui nécessite l’installation du CTP RyuJIT et ne fonctionne que sous Windows 8.

Vous pouvez également simplement utiliser une bibliothèque SSE native et l'invoquer à partir de C #. Par exemple, la bibliothèque Yeppp, voir cette réponse StackOverflow .

Bien sûr, vous le pouvez (la question la plus importante est: pourquoi le feriez-vous? Laissez le temps au runtime, c'est son travail).

C # vous permet de mapper un délégué sur une adresse mémoire. Cette adresse mémoire peut contenir des codes d'assemblage bruts. Vous pouvez en savoir plus sur Le blog de Michael Giagnocavo .

Même si je n'ai pas essayé moi-même, il est peut-être possible d'utiliser Marshal.GetDelegateForFunctionPointer également.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top