Qual é o impacto da semântica de movimentação do C ++ 11 no contexto da computação científica?

10

O C ++ 11 introduz a semântica de movimentação que pode, por exemplo, melhorar o desempenho do código em situações em que o C ++ 03 precisaria executar uma construção de cópia ou atribuição de cópia. Este artigo relata que o código a seguir experimenta uma velocidade de 5x quando compilado com C + 11:

vector<vector<int> > V;
for(int k = 0; k < 100000; ++k) {
    vector<int> x(1000);
    V.push_back(x);
}

Qual é o impacto da semântica de movimentação do C ++ 11 no contexto da computação científica?

Estou interessado nesta questão é geral, mas, mais especificamente, também estou interessado em semântica de movimento para códigos de elementos finitos escritos usando bibliotecas de impulso. Testei alguns dos meus próprios códigos C ++ 03 usando a versão 1.47.0 do boost (desde que as notas de versão do boost mencionam a semântica de movimentos são introduzidas na 1.48.0) e a versão 1.53.0 do boost, mas não notei muitas melhorias. Eu acho que as economias de não ter que fazer cópia-construção para boost::numeric::ublas::vector/ matrixe boost::functionnão são perceptíveis, pois a solução de matrizes do sistema constitui a maior parte da carga de trabalho.

Editar: Na verdade, parece que a semântica de movimentação só é implementada boost::function(consulte as notas de lançamento da versão 1.52.0 ). Não há menção de semântica de movimento boost::numeric, eu procurei as fontes para ter certeza e parece não haver referências de valor.

Matija Kecman
fonte
11
Como você observou na última parte da sua pergunta, a menos que você crie um perfil do seu código e tenha visto muitas cópias em andamento, não será possível melhorar substancialmente seu desempenho usando a semântica de movimentação.
Bill Barth

Respostas:

10

Penso que, na prática, o impacto é limitado e será limitado.

A razão pela qual está limitado agora é que os grandes pacotes de elementos finitos têm o cuidado de escrever um código portátil e, portanto, eles ainda não usam construções de linguagem C ++ 11 em seus próprios códigos.

Obviamente, eles se beneficiarão de códigos como o que você mostra onde, mesmo sem precisar alterar o código-fonte, você se beneficia de uma biblioteca aprimorada de suporte ao compilador, como o libstdc ++ for GCC. Dito isto, as pessoas na computação científica estão bem cientes das despesas de cópia e, portanto, para objetos onde importa, elas simplesmente não copiam - elas geram no local, ou fazem cópias rasas ou usam compartilhada ponteiros ou muitas das outras técnicas disponíveis para evitar a sobrecarga da cópia. Em outras palavras, a situação para a qual a semântica de movimentos foi inventada na verdade não ocorre com muita frequência em códigos científicos "reais".

Wolfgang Bangerth
fonte