O compilador sinaliza para o mplayer2 para otimizá-lo para hardware antigo

5

Eu apenas compilei mplayer2 da fonte ( git://git.mplayer2.org/mplayer2-build.git ) porque a versão do repositório (ubuntu 12.04) não funcionava no meu sistema. Desde que eu tenho hardware antigo eu só queria saber se existem alguns sinalizadores de compilador que eu poderia usar para otimizá-lo para o meu hardware.

A CPU é uma placa gráfica Athlon XP 2200+ (móvel), 1 GB de RAM: Nvidia GeForce4 420 Go.

Eu também quero fazer o mesmo em outro sistema antigo com especificações semelhantes:

CPU: Athlon 1,2 GHZ, 1 GB de RAM, gráficos: [SiS] 65x / M650 / 740

    
por student 18.08.2012 / 18:42

1 resposta

1

Recomendação geral

Se a versão retirada do seu repositório de distribuição do mplayer2 não trabalhar para você, é uma coisa boa para relatar o que não funcionou para o bug sistema de rastreamento, para que ele tenha benefícios para você e para os outros:

  • Fixa-se para o seu hardware neste lançamento da sua distribuição.
  • Ele funcionará (com alta probabilidade) quando você atualizar para uma versão mais recente da distribuição, sem ter que se preocupar.
  • Ele beneficiará outras pessoas que possam ter o mesmo problema, mas, como você, não assumiu a tarefa de relatar o erro.

Recompilação em um sistema particular

Recompilar o programa especificamente para suas máquinas provavelmente terá melhores resultados do que o sabor "genérico" que uma distribuição libera é, BTW, uma das motivações que o pessoal do Gentoo tem quando eles recompilar as coisas para seus próprios sistemas).

Claro, você pode ganhar algumas melhorias na velocidade, mas você perde o portabilidade dos binários.

A compilação genérica

Dito isto, a maneira geral de recompilar um programa em uma corrente Sistema Debian / Ubuntu é pegar o pacote fonte e sua compilação dependências com algo como:

sudo apt-get build-dep mplayer2
sudo apt-get install fakeroot
apt-get source mplayer2

edite o arquivo debian/rules dentro do diretório criado pelo último comando para alterar os valores que vão no CFLAGS , CPPFLAGS , CXXFLAGS e LDFLAGS .

O que você pode fazer para adaptar o aplicativo às suas máquinas? Voce terá que experimento (leia-se "medida / benchmark", veja abaixo) com qual nível de otimização (como -O2 , -Os ou -O3 ) o programa é executado mais rapidamente.

Para realmente compilar o programa, você precisará executar, dentro do diretório criado pelo comando apt-get source mplayer2 :

fakeroot debian/rules binary
sudo dpkg -i ../*.deb

Com o GCC versões 4.7 ou mais recentes, você pode até experimentar o -Ofast nível de compilação, que para reproduzir vídeos não vai causar muito prejudicar, mas que pode dar-lhe algumas melhorias (o suficiente para não acumular quadros e obter áudio e vídeo fora de sincronia).

As partes específicas do sistema / hardware da compilação

Para compilar o programa especificamente para a máquina onde você será Para executá-lo, é bom usar o sinalizador -mach=native do GCC. Isso vai provavelmente tornar os binários produzidos inutilizáveis em outros sistemas, mas contanto que como você se importa apenas com o seu sistema, esse é o caminho a seguir.

Só para você ter uma ideia de quais opções estão ativadas no meu Core i5-2410M quando eu uso -march=native , veja (saída reformatada para não destruir o layout do site):

gcc -march=native -E -v - < /dev/null 2>&1 | grep cc1
/usr/lib/gcc/i486-linux-gnu/4.7/cc1 -E -quiet -v -imultiarch i386-linux-gnu - \
  -march=corei7-avx -mcx16 -msahf -mno-movbe -maes -mpclmul -mpopcnt \
  -mno-abm -mno-lwp -mno-fma -mno-fma4 -mno-xop -mno-bmi -mno-bmi2 \
  -mno-tbm -mavx -mno-avx2 -msse4.2 -msse4.1 -mno-lzcnt -mno-rdrnd \
  -mno-f16c -mno-fsgsbase --param l1-cache-size=32 \
  --param l1-cache-line-size=64 \
  --param l2-cache-size=3072 -mtune=corei7-avx

De lá, você pode ver que o GCC detectou algumas instruções "avançadas" que meu computador tem (AVX) e outros que não tem (AVX2).

Como medir os resultados

Como sugestão, para avaliar, basta reproduzir um vídeo curto, digamos, foo.mkv com:

mplayer -benchmark -vo null -nosound foo.mkv

Isso "reproduzirá" o vídeo o mais rápido possível e informará quantas segundos que levou para "reproduzir" o vídeo em sua totalidade. Note que eu disse "play" entre aspas, porque estamos desativando:

  • A decodificação de som com -nosound . Geralmente menor tempo é gasto aqui, em comparação com as outras partes de reprodução de um vídeo.
  • O tempo necessário para realmente exibir o vídeo ( -vo null ).

Para ver se a placa de vídeo está atrapalhando ou não, você pode omitir a parte -vo null do comando acima e ver se o vídeo desejado é reproduzido mais rápido do que em tempo real (ou qualquer que seja seu objetivo).

Algumas palavras finais, parte 1: o caso específico do mplayer2

Dito isto, muito do mplayer2 (e mplayer regular, quando este mais tarde é tirado de distribuições) é que a maior parte de seu processamento é "descarregada" para bibliotecas. Em particular, muito da decodificação é feita por libav ou ffmpeg, e esses são os pacotes que devem ser compilados / otimizados no primeiro lugar.

No caso do mplayer "vanilla" (não mplayer2) tirado do upstream, ele usa cópias embutidas de muitas bibliotecas, o que significa que, se você compilá-lo de as fontes upstream (em vez do método que eu dei acima com apt-get source mplayer2 etc), ele também irá compilar sua própria libav / ffmpeg e tem o potencial de ser muito mais rápido que as alternativas.

Algumas palavras finais, parte 2: obter alguns ganhos sem recompilar

Nem sempre é necessário recompilar os binários mplayer / mplayer2 fornecido pela sua distribuição, se você alterar alguns parâmetros de configuração. Para evitar todo o trabalho acima, eu começaria tocando os vídeos com algo como:

mplayer -framedrop -lavdopts fast:skipframe=nonref:skiploopfilter=nonref foo.mkv

Claro, você pode jogar com as opções que eu acabei de te dar manpage documenta os valores possíveis para skipframe e skiploopfilter , entre outras coisas.

E feliz assistindo vídeos!

    
por 10.11.2012 / 02:42