Pergunta
Eu estava lendo uma pergunta sobre otimização de código C # e uma solução foi usar c ++ com SSE. É possível fazer SSE diretamente de um programa c #?
Solução
O próximo Mono versão 2.2 terá suporte SIMD. Miguel de Icaza blog sobre o próximo recurso aqui , ea API é < a href = "http://go-mono.com/docs/index.aspx?tlink=0@N%3aMono.Simd" rel = "noreferrer"> aqui .
Apesar de haver uma biblioteca que irá apoiar o desenvolvimento em tempo de execução do Microsoft .NET Windows, ele não terá os benefícios de desempenho que você está procurando a menos que você executar o código sob o runtime Mono. O que pode ser factível, dependendo de suas circunstâncias.
Update: Mono 2.2 é lançado
Outras dicas
Can C # fazer explicitamente uma chamada SSE?
No. C # não podem produzir em linha IL muito menos em linha x86 / amd64 montagem.
O CLR, e mais especificamente o JIT, irá usar SSE se ele está disponível eliminando a necessidade de forçá-lo na maioria das circunstâncias. Eu digo mais porque eu não sou um especialista SSE e tenho certeza de que há casos em que pode ser benéfico e o JIT não faz a otimização.
SIMD para .NET estará disponível no futuro próximo. RyuJIT (o compilador JIT-próxima geração para .NET) necessário para esta função ATM.
Você deve usar classe Microsoft.Numerics.Vectors.Vector<T>
de Microsoft.Bcl.Simd pacote a tomar proveito desse recurso. código de exemplo aqui .
Com base em este fórum destacamento , o compilador JIT MS usa automaticamente SSE se SSE está disponível na máquina de destino.
Se você tem um 'pedaço' de trabalho que você quer fazer, a melhor aposta é a de escrevê-lo em C ++ usando os intrínsecos MMX / SSE e depois fazer uma muito simples / clr gerenciado C ++ classe que envolve seu funcionalidade e expõe como uma classe .net. Em seguida, seu código pode apenas usar esse conjunto como se fosse uma classe normal.
Para saber mais sobre o VC intrínsecos você pode olhar para esta pequena cantiga eu escrevi há muitos anos.
http://msdn.microsoft.com/en-us/library /0aws1s9k.aspx
Oh - eu estou supondo que você está realmente querendo usar as funções paralelas à velocidade alguma coisa. Como outros têm para fora pontas - se você quiser apenas para mover dados em pedaços maiores e similares, o JIT já sabe como usar SSE para as noções básicas
.Filip está correto. Eu tenho um outro post, mais velho que mostra um exemplo semelhante, mas mais detalhado. Eu, na verdade executar esse código, e modificou-me provar a mim mesmo que ele funciona. Estou pensando usando esta técnica em um projeto que estou trabalhando e é por isso que estou fora, olhando para ver o que pode ser novo uma vez que este é um pouco velha. Como o autor indica, você pode escrever qualquer função que você deseja em C ++, compilá-lo, em seguida, copiar os bytes em seu C #.
http://blogs.msdn.com/ b / devinj / Arquivo / 2005/07/12 / 438323.aspx
Gostaria de acrescentar que a classe de Joe CLI C ++ é uma boa idéia, bem como, no entanto, eu não acho que a bandeira compilador sse ea bandeira / clr são compatíveis no mesmo projeto. Eu apenas verificado que: tem que escrever o seu código de alta perf em um projeto separado para usar o SSE (/ arch: SSE ou / arch: SSE2) flag compilador como / clr é incomatible. Para fazer muito mais complexa nada do que aritmética simples em algumas entradas, penso que esta é a melhor abordagem.
Recentemente, a Microsoft lançou uma biblioteca vector beta SIMD ( Microsoft.Bcl.Simd ) para C #, que requer a instalação do RyuJIT CTP e só funciona Windows 8.
Você também pode simplesmente usado uma biblioteca nativa SSE e chamá-lo de C #. Por exemplo, a biblioteca Yeppp, consulte este StackOverflow resposta .
É finalmente possível. Aqui o pós http://blogs.msdn.com/b/dotnet/archive/2014/04/07/the-jit-finally-proposed-jit-and-simd-are-getting-married. aspx
Claro que você pode (a questão mais importante é - por que você Basta deixá-lo para o tempo de execução;? Que é o seu trabalho).
C # permite mapear um delegado para um endereço de memória. Esse endereço de memória pode conter códigos de montagem matérias. Você pode ler mais sobre blog de Michael Giagnocavo .
Embora eu não tenha me tentado, pode ser possível usar Marshal.GetDelegateForFunctionPointer também.