Pergunta

Eu tenho um monte de código MATLAB agradável que corre muito lentamente e seria uma dor para escrever sobre em compilador C. O MATLAB para C parece não ajuda muito, se em tudo. Caso seja acelerando a execução até mais? Am I parafusado?

Foi útil?

Solução

Eu vou repetir o que DWJ disse: se o seu código MATLAB é lento, esta é provavelmente porque não é suficientemente vetorizado. Se você estiver fazendo laços explícitos quando você poderia estar fazendo operações em arrays inteiros, isso é o culpado.

Isto aplica-se igualmente a todas as linguagens dinâmicas orientada a matriz: Perl Data Language, Numeric Python, Matlab / Octave, etc. É ainda verdade até certo ponto no código compilado compilado C e Fortran: bibliotecas de vectorização especialmente projetados geralmente usam cuidadosamente mão -coded espiras internas e instruções SIMD (por exemplo, MMX, SSE, AltiVec).

Outras dicas

Se você estiver usando o MATLAB complier (em uma versão recente do MATLAB), então você quase certamente não verá nenhum speedups em tudo. Isto porque tudo o compilador realmente faz é dar-lhe uma forma de embalar o seu código para que ele possa ser distribuído para as pessoas que não têm MATLAB. Ele não convertê-lo para qualquer coisa mais rápido (como código de máquina ou C) -. Ele simplesmente envolve-lo em C para que você possa chamá-lo

Ele faz isso por obter o seu código para ser executado no MATLAB Compiler Runtime (MCR), que é essencialmente o MATLAB computacional do kernel - seu código ainda está sendo interpretado. Graças à penalidade de ter que chamar o MCR você pode achar que compilados código é executado mais lentamente do que se você simplesmente correu em MATLAB.

Dito de outra forma - pode-se dizer que o compilador na verdade não compilar -., No sentido tradicional da palavra, pelo menos

As versões mais antigas do compilador trabalhado de forma diferente e speedups poderia ocorrer em determinadas situações. Para tomada de Mathwork sobre isso, vá para

http://www.mathworks.com/support/solutions/ dados / 1-1ARNS.html

Em minha experiência código MATLAB lenta geralmente vem de não vectorizing seu código (ou seja, escrevendo para-lacetes em vez de matrizes apenas multiplicando (exemplo simples)).

Se você está fazendo arquivo I / O olhar para fora para a leitura de dados em uma única peça de cada vez. Olhe nos arquivos de ajuda para a versão vectorized de fscanf.

Não se esqueça que MATLAB inclui um profiler, também!

Primeiro, I segundo todos os comentários acima sobre criação de perfil e vectorizing.

Para uma perspectiva histórica ...

versão mais antiga do Matlab permitia ao usuário arquivos m converter para mex funções de pré-análise do código de m e convertê-lo para um conjunto de chamadas de biblioteca Matlab. Essas chamadas têm toda a verificação de erros que o intérprete fez, mas versões antigas do intérprete e / ou analisador on-line eram lentos, então compilar o arquivo m, às vezes ajuda. Normalmente ele ajudou quando teve laços porque Matlab foi inteligente o suficiente para inline alguns dos que em C. Se você tiver uma dessas versões do Matlab, você pode tentar dizer o script mex para salvar o arquivo .c e você pode ver exatamente o que é fazendo.

Na versão mais recente (provavelmente 2006a e mais tarde, mas não me lembro), Mathworks começou a usar um compilador just-in-time para o intérprete. Com efeito, este compilador JIT compila automaticamente todas as funções mex, tão explicitamente a fazê-lo offline não ajuda em nada. Em cada versão desde então, eles também colocar um monte de esforço em fazer o intérprete muito mais rápido. Eu acredito que as versões mais recentes do Matlab não até deixá-lo automaticamente arquivos m de compilação para MEX arquivos porque não faz sentido mais.

O compilador MATLAB embrulha-se o seu m-código e envia-lo para um tempo de execução MATLAB. Assim, o desempenho que você vê em MATLAB deve ser o desempenho que você vê com o compilador.

Por outras respostas, vectorizing seu código é útil. Mas, o MATLAB JIT é bom muito estes dias e muitas coisas realizam aproximadamente bem vetorizado ou não. That'a para não dizer que não existem benefícios de desempenho a serem obtidos a partir de vetorização, não é só a bala mágica era uma vez. A única maneira de realmente dizer é usar o profiler para descobrir onde o código está vendo gargalos. Muitas vezes existem alguns lugares onde você pode fazer refactoring local para realmente melhorar o desempenho do seu código.

Há um par de outro hardware se aproxima de você pode ter sobre o desempenho. Primeiro, grande parte da álgebra linear subsistema é multithreaded. Você pode querer ter a certeza que permitiram que, em suas preferências, se você está trabalhando em um multi-core ou plataforma multi-processador. Segundo, você pode ser capaz de usar a caixa de ferramentas de computação paralela para tirar mais proveito dos vários processadores. Finalmente, se você é um usuário Simulink, você pode ser capaz de usar emlmex para m-código de compilação em c. Isto é particularmente eficaz para o trabalho ponto fixo.

Você já tentou o perfil de seu código? Você não precisa vetorizar todo o seu código, apenas as funções que tempo de execução dominar. O profiler MATLAB vai lhe dar algumas dicas sobre onde o código está gastando mais tempo.

Existem muitas outras coisas que você deve ler-se sobre o Dicas para melhorar a seção Desempenho nas MathWorks manual.

MCC não irá acelerar o seu código em tudo - não é realmente um compilador.

Antes de desistir, você precisa executar o profiler e descobrir onde todo o seu tempo está indo (Ferramentas-> Abrir Profiler). Além disso, o uso criterioso de "tic" e "toc" pode ajudar. Não otimizar seu código até que você saiba onde o tempo vai (não tentar adivinhar).

Tenha em mente que em Matlab:

  • operações de nível bit são muito lentas
  • arquivo de I / O é lento
  • loops são geralmente lento, mas vectorizing é rápido (se você não sabe a sintaxe vetor, aprendê-la)
  • operações centrais são muito rápidos (por exemplo matriz se multiplicam, FFT)
  • Se você acha que pode fazer algo mais rápido em C / Fortran / etc, você pode escrever um arquivo MEX
  • existem soluções comerciais para Matlab converter para C (google "Matlab para c") e eles funcionam

Você poderia portar seu código para "Matlab Incorporado" e, em seguida, usar o Realtime-Oficina para traduzi-lo para C.

Incorporado Matlab é um subconjunto de Matlab. Ele não suporta Cell-matrizes, gráficos, Marices de tamanho dinâmico, ou alguns modos de endereçamento Matrix. Pode demorar um esforço considerável para a porta para Matlab incorporado.

Realtime-Workshop é o cerne da geração de código produtos. É expelir genérico C, ou pode optimizar para uma gama de plataformas embarcadas. Mais interessantes para você é, talvez, o xPC-alvo, que trata de hardware de propósito geral como alvo incorporado.

Eu votaria para perfilar +, em seguida, olhar para o que são os gargalos.

Se o gargalo é matemática matriz, você provavelmente não vai fazer melhor ... exceto uma grande pegadinha é alocação de matriz. por exemplo. se você tem um loop:

s = [];
for i = 1:50000
  s(i) = 3;
end

Isto tem de manter o redimensionamento da matriz; é muito mais rápido para précolagem a matriz (começar com zeros ou NaN) e preenchê-lo de lá:

s = zeros(50000,1);
for i = 1:50000
  s(i) = 3;
end

Se o gargalo é repetido execuções de um monte de chamadas de função, que é uma pergunta difícil.

Se o gargalo é o material que MATLAB não faz rapidamente (certos tipos de análise, XML, coisas assim), então eu usaria Java desde MATLAB já é executado em uma JVM e ele interage muito facilmente para arquivos JAR arbitrárias. Olhei para a interface com C / C ++ e é realmente feio. Microsoft COM é ok (apenas no Windows), mas depois de aprender Java Eu não acho que nunca vou voltar a isso.

Como outros observou, código Matlab lento é frequentemente o resultado de vetorização insuficiente.

No entanto, o código às vezes até perfeitamente vetorizado é lento. Então, você tem várias opções mais:

  1. Veja se existem quaisquer bibliotecas / caixas de ferramentas que você pode usar. Estes foram escritos geralmente a ser muito otimizado.
  2. Perfil seu código, encontrar os pontos apertados e reescrever aqueles em C. planície Conectando código C (como DLLs por exemplo) para Matlab é fácil e é coberto na documentação.

Por compilador Matlab você provavelmente significa que o MCC comando, que faz velocidade o código um pouco, contornando intérprete Matlab. O que iria acelerar o código MATLAB significativamente (por um fator de 50-200) é o uso de código real C compilado pelo comando mex.

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