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 #?

Foi útil?

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 .

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top