Continuamos a revisar o novo computador doméstico. Após um breve conhecimento dos recursos da arquitetura Elbrus, consideraremos as ferramentas de desenvolvimento de software oferecidas a nós.
Lembre-se da estrutura do artigo:- revisão de hardware :
- processo de aquisição;
- hardware
- revisão de software :
- lançamento do sistema operacional;
- software regular;
- visão geral das ferramentas de desenvolvimento:
- desempenho de benchmarking :
- Descrição de computadores rivais
- resultados de benchmark;
- resumindo.
Boa leitura!Recursos de arquitetura
A essência da arquitetura E2K em uma frase pode ser formulada da seguinte maneira: registros de 64 bits, paralelismo explícito da execução de instruções e acesso estritamente controlado à memória.Por exemplo, processadores de arquitetura x86 ou SPARC capazes de executar mais de uma instrução por ciclo (superescalar) e, às vezes, também fora de ordem, estão implícitosparalelismo: o processador analisa diretamente as dependências entre as instruções em uma pequena seção de código e, se considerar possível, carrega determinados atuadores ao mesmo tempo. Às vezes, ele age muito otimista - especulativamente, descartando o resultado ou revertendo a transação em caso de previsão malsucedida. Às vezes, pelo contrário, é muito pessimista - assumindo dependências entre os valores dos registradores ou partes dos registradores, que na verdade não são do ponto de vista do programa executável.Se explícitoparalelismo (computação explicitamente paralela de instruções, EPIC), a mesma análise ocorre no estágio de compilação e todas as instruções de máquina definidas para execução paralela são escritas em uma palavra de instrução muito grande (VLIW) - e a Elbrus tem o tamanho dessa As “palavras” não são fixas e podem ter de 1 a 8 palavras duplas (neste contexto, uma única palavra tem capacidade para 32 bits).Sem dúvida, o compilador tem muito mais oportunidades em termos de quantidade de código coberto, tempo e memória gastos e, ao escrever o código da máquina manualmente, o programador pode realizar uma otimização ainda mais inteligente. Mas isso é na teoria e, na prática, é improvável que você use o assembler, e, portanto, tudo depende de quão bom é o compilador de otimização, e escrever um não é uma tarefa fácil, para dizer o mínimo. Além disso, se, com paralelismo implícito, as instruções "lentas" continuarem funcionando sem bloquear o recebimento das instruções a seguir em outros atuadores, com paralelismo explícito, todo o comando amplo aguardará a conclusão completa. Finalmente, um compilador otimizador ajudará pouco na interpretação de linguagens dinâmicas.Tudo isso é bem entendido no MCST, é claro, e, portanto, a Elbrus também implementa tecnologias de execução especulativa, código e dados pré-carregados e operações computacionais combinadas. Portanto, em vez de teorizar e se perguntar infinitamente quantos gigaflops hipotéticos essa ou aquela plataforma podem dar sob um conjunto de circunstâncias bem-sucedidas, na quarta parte do artigo, apenas pegamos e avaliamos o desempenho real de programas reais - aplicados e sintéticos.VLIW: um avanço ou um beco sem saída?, VLIW : , ‑ Transmeta Crusoe — «». , Efficeon ( ) . , x86- , . , Pentium M , Pentium 4 , . VIA C3, x86.
Devido à sua natureza exótica, a tecnologia de execução protegida de programas em linguagens C / C ++, onde o uso de ponteiros oferece uma ampla gama de oportunidades para dar um tiro no pé, não é menos interessante. O conceito de proteção contextual, implementado em conjunto pelo compilador no estágio de montagem e o processador em tempo de execução, bem como o sistema operacional em termos de gerenciamento de memória, não permitirá que o escopo das variáveis seja violado - seja acessando uma variável de classe privada, dados privados de outro módulo, variáveis locais da função de chamada . Quaisquer manipulações com a alteração do nível de acesso são permitidas apenas na direção da redução de direitos. Salvar links para objetos de vida curta em estruturas de vida longa é bloqueado. As tentativas também são impedidas de usar links mortos: se o objeto para o qual o link foi recebido uma vez já tiver sido excluído,mesmo a localização de outra instalação nova no mesmo endereço não será considerada uma desculpa para acessar seu conteúdo. Incentivado a usar dados como um código e transferir o controle para qualquer lugar.De fato, assim que passamos de idiomas de alto nível para indicadores de baixo nível, todas essas áreas de visibilidade acabam sendo nada além de sal sintático. Alguns casos (mais simples) de uso indevido de ponteiros às vezes podem ajudar a capturar analisadores estáticos de código fonte. Mas quando o programa já foi traduzido para as instruções da máquina x86 ou SPARC, nada o impedirá de ler ou gravar o valor da célula de memória ou do tamanho errado, o que levará à falha em um local completamente diferente - e aqui está você, olhando a pilha danificada e você não tem idéia por onde começar a depuração, porque na outra máquina o mesmo código é executado com êxito. E o estouro de pilha e as vulnerabilidades resultantes são apenas o flagelo das plataformas populares. É gratificante que nossos desenvolvedores abordem sistematicamente esses problemas,e não se limitando a organizar cada vez mais muletas, cujo efeito ainda se assemelha a um ancinho. Afinal, ninguém se importa com a rapidez com que seu programa funciona, se não funcionar corretamente. Além disso, um controle mais rígido do compilador obriga a reescrever o código "mau cheiro" e intolerável, o que significa que ele indiretamente aprimora a cultura de programação.A ordem dos bytes ao armazenar números na memória da Elbrus, diferentemente do SPARC, é pouco endian (o byte mais baixo vem primeiro), ou seja, como no x86. Da mesma forma, como a plataforma visa oferecer suporte ao código x86, não há restrições no alinhamento de dados na memória.Ordem, Alinhamento e Portabilidade , Intel, , (, 32‑ 0x04000005) — , , , . - , , , — , ( , UTF‑16), , , , ‑. , , — , SPARC, — .
Você pode ler mais sobre o design dos computadores MCST nas arquiteturas SPARC e E2K no livro "Microprocessadores e complexos de computação da família Elbrus", publicado pela Peter Publishing House em uma tiragem mínima de impressão e vendido há muito tempo, mas está disponível gratuitamente em formato PDF ( 6 MB ) e por uma pequena taxa no Google Play . No contexto da falta de outras informações detalhadas de domínio público, esta publicação é apenas um depósito de conhecimento. Mas o texto está concentrado principalmente no hardware, nos algoritmos de operação de buffers e pipelines, caches e dispositivos lógicos aritméticos - o tópico de escrever programas [eficazes] não é completamente abordado, e até mesmo mencionar as instruções da máquina pode ser contado nos dedos.Linguagem de máquina
Além de compilar as linguagens de alto nível C, C ++, Fortran, a documentação em todas as oportunidades não esquece de mencionar a possibilidade de escrever programas diretamente no Assembler, mas em nenhum lugar é especificado como exatamente você pode se envolver nessa arte de filigrana, onde pelo menos você pode obter uma referência às instruções da máquina. Felizmente, o sistema possui um depurador GDB que pode desmontar o código de programas compilados anteriormente. Para não ir além do escopo do artigo, escrevemos uma função aritmética simples que possui uma boa lista de pendências para paralelização.uint64_t CalcParallel(
uint64_t a,
uint64_t b,
uint64_t c,
uint32_t d,
uint32_t e,
uint16_t f,
uint16_t g,
uint8_t h
) {
return (a * b) + (c * d) - (e * f) + (g / h);
}
Aqui está o que ele traduz ao compilar no modo -O3 :0x0000000000010490 <+0>:
muld,1 %dr0, %dr1, %dg20
sxt,2 6, %r3, %dg19
getfs,3 %r6, _f32,_lts2 0x2400, %g17
getfs,4 %r5, _lit32_ref, _lts2 0x00002400, %g18
getfs,5 %r7, _f32,_lts3 0x200, %g16
return %ctpr3
setwd wsz = 0x5, nfx = 0x1
setbp psz = 0x0
0x00000000000104c8 <+56>:
nop 5
muld,0 %dr2, %dg19, %dg18
muls,3 %r4, %g18, %g17
sdivs,5 %g17, %g16, %g16
0x00000000000104e0 <+80>:
sxt,0 6, %g17, %dg17
addd,1 %dg20, %dg18, %dg18
0x00000000000104f0 <+96>:
nop 5
subd,0 %dg18, %dg17, %dg17
0x00000000000104f8 <+104>:
sxt,0 2, %g16, %dg16
0x0000000000010500 <+112>:
ct %ctpr3
ipd 3
addd,0 %dg17, %dg16, %dr0
A primeira coisa que chama sua atenção é que cada comando é decodificado imediatamente em várias instruções executadas em paralelo. A designação mnemônica de instruções é geralmente intuitiva, embora alguns nomes pareçam incomuns após a Intel: por exemplo, uma instrução de extensão não assinada aqui é chamada sxt , não movzx . O parâmetro de muitos comandos computacionais, além dos próprios operandos, é o número do dispositivo executivo - não é sem razão que o ELBRUS defende o agendamento explícito de utilização de recursos básicos, ou seja, “planejamento explícito para o uso de recursos básicos”.Para acessar o valor completo do registro de 64 bits, o prefixo “ d"; em teoria, também é possível acessar os 16 e 8 bits mais baixos do valor. A designação de registros globais de uso geral, dos quais existem 32 partes, é prefixada com " g " antes do número , e o procedimento local é registrado com o prefixo " r ". O tamanho da janela dos registros locais solicitados pela instrução setwd pode chegar a 224 e a bomba é empurrada para a pilha automaticamente conforme necessário.A maneira como você aplica certas instruções é confusa: por exemplo, retorne, como você pode imaginar, serve para retornar o controle ao procedimento de chamada, no entanto, em todas as amostras de código estudadas, essa instrução ocorre muito antes do último comando (onde algum tipo de manipulação de contexto também está presente), às vezes até na primeira palavra de comando, como aqui. Embora o livro acima mencionado pague um parágrafo inteiro a esse problema, ainda não ficou claro para nós. Atualização a partir de 9 de fevereiro de 2016: os comentários sugerem que a instrução return apenas prepara o caminho para o retorno do subprograma e permite que o processador comece a carregar os próximos comandos do procedimento de chamada, e o próprio controle retorna quando a execução atinge a instrução ct .No entanto, “código de fácil leitura” e “código eficiente” estão longe de ser os mesmos quando se trata de instruções da máquina. Se você compilar sem otimização, o código será mais consistente e semelhante ao cálculo da testa, mas ao custo de aumentar: em vez de 6 palavras de comando saturadas, 8 esparsas serão geradas.Sessão de previsão do futuro com base em café para o sim, vamos terminar antes de fantasiarmos com suposições completamente ridículas. Vamos esperar que um dia a referência de comando e o guia de programação e otimização sejam divulgados.Ferramentas de desenvolvimento
O compilador de linguagem C / C ++ padrão no sistema operacional Elbrus é o LCC, um desenvolvimento proprietário da empresa MCST, compatível com o GCC. Informações detalhadas sobre a estrutura e os princípios desse compilador não são publicadas, mas de acordo com uma entrevista com um ex-desenvolvedor de uma das várias subespécies desenvolvidas do compilador, o Edison Design Group usa um front-end para análise de alto nível dos códigos-fonte e a tradução de baixo nível nas instruções da máquina podem ser executadas de diferentes maneiras - sem otimização ou com otimização. É o compilador de otimização entregue aos usuários finais, não apenas na plataforma E2K, para a qual simplesmente não existem geradores de código de máquina alternativos, mas também na família de plataformas SPARC, onde também está disponível o GCC habitual como parte do sistema operacional MSVS.Considerando os recursos arquiteturais listados acima - simultaneidade óbvia, execução segura de programas - o compilador LCC implementa obviamente muitas soluções únicas dignas dos mais rigorosos estudos e testes na prática. Infelizmente, no momento da redação dessas linhas, o autor não possui qualificações suficientes para isso, nem tempo para tais estudos; Espero que, mais cedo ou mais tarde, essa questão seja abordada por um círculo muito mais amplo de representantes da comunidade de TI, incluindo os mais competentes.Pelo que você percebeu a olho nu ao criar programas para testar o desempenho, o LCC no E2K, com mais freqüência do que outros, alerta sobre possíveis erros, construções analfabetas ou simplesmente lugares suspeitos no código. É verdade que o autor não está tão familiarizado com o GCC para garantir a distinção entre mensagens únicas do LCC em russo e simplesmente traduzidas (além disso, a tradução é seletiva), e não tenho certeza de que um fluxo mais intenso de avisos não seja uma consequência da configuração de montagem concluída automaticamente. Além disso, sem conhecer a semântica de uma seção específica do código, às vezes é difícil entender o quão inteligente o compilador é em encontrar erros ocultos ou acionar um alarme falso. Por exemplo, no código do Postgresql, a mesma construção é encontrada quatro vezes no mesmo arquivo com pequenas variações:for (i = 0, ptr = cont->cells; *ptr; i++, ptr++) {
if ((*ptr)[strspn(*ptr, " \t")] == '\0')
fputs(" ", fout);
else
html_escaped_print(*ptr, fout);
}
O compilador prevê uma possível saída da matriz unidimensional na cadeia de caracteres com a chamada da função strspn . Sob quais circunstâncias isso pode acontecer, o autor não entende (e não houve esse aviso em outras plataformas, embora o modo de verificação seja dentro dos limites da garantia)é padrão para o GCC), no entanto, vale ressaltar que a replicação múltipla do mesmo design não trivial (já que era necessário explicar seu objetivo no comentário), em vez de colocá-lo em uma função separada com um nome eloquente que não requer explicação. Mesmo que o alarme tenha sido falso, detectar um código de mau cheiro é um efeito útil; os autores do analisador estático PVS - Studio ficarão sem trabalho. Mas seriamente, seria divertido e útil comparar quais erros adicionais no código o LCC é realmente capaz de detectar devido aos recursos exclusivos da arquitetura E2K - ao mesmo tempo, o mundo do software livre poderia receber outro lote de relatórios de erros.Outro resultado de um conhecido curioso com LCC loquaz foi o autor da educação, e então seus colegas mais experientes, sobre o que trigraphs ( trigraphs ) em linguagens C / C ++, e por que eles não são suportados por padrão, felizmente. É assim que você vive e não suspeita que a combinação aparentemente inócua de pontuação em literais ou comentários de texto possa vir a ser uma bomba-relógio - ou um excelente material para um marcador de programa, dependendo do lado da barricada em que você está.Uma conseqüência desagradável da auto-suficiência do LCC é que seu formato de mensagem é diferente do GCC e, quando compiladas em um ambiente de desenvolvimento (por exemplo, Qt Creator), essas mensagens caem apenas no log geral de trabalho, mas não na lista de problemas reconhecidos. Talvez isso possa ser personalizado de alguma forma, seja do lado do compilador ou no ambiente de desenvolvimento, mas pelo menos pronto para o uso, ele não se entende.Tradicionalmente agudo para plataformas domésticas, devido ao seu desempenho relativamente baixo, há a questão da compilação cruzada, ou seja, a montagem de programas para a arquitetura de destino e um conjunto específico de bibliotecas de sistemas, usando os recursos de computadores mais poderosos, com arquitetura diferente e outros softwares. A julgar pelas linhas de identificação no núcleo do sistema Elbrus e no próprio compilador LCC, elas são montadas no Linux i386, mas este kit de ferramentas para x86, é claro, não está incluído no pacote de distribuição do próprio sistema. É interessante, mas é possível fazer o oposto: na Elbrus, para coletar programas para outras plataformas? (O autor não teve sucesso além da primeira fase da montagem do GCC para o i386.)Versões dos pacotes mais significativos para o desenvolvedor:- compiladores: lcc 1.19.18 (compatível com gcc 4.4.0);
- : erlang 15.b.1, gawk 4.0.2, lua 5.1.4, openjdk 1.6.0_27 (jvm 20.0‑b12), perl 5.16.3, php 5.4.11, python 2.7.3, slang 2.2.4, tcl 8.6.1;
- : autoconf 2.69, automake 1.13.1, cmake 2.8.10.2, distcc 3.1, m4 1.4.16, make 3.81, makedepend 1.0.4, pkgtools 13.1, pmake 1.45;
- : binutils 2.23.1, elfutils 0.153, patchelf 0.6;
- : boost 1.53.0, qt 4.8.4, qt 5.2.1;
- : expat 2.1.0, ffi 3.0.10, gettext 0.18.2, glib 2.36.3, glibc 2.16.0, gmp 4.3.1, gtk+ 2.24.17, mesa 10.0.4, ncurses 5.9, opencv 2.4.8, pcap 1.3.0, popt 1.7, protobuf 2.4.1, sdl 1.2.13, sqlite 3.6.13, tk 8.6.0, usb 1.0.9, wxgtk 2.8.12, xml‑parser 2.41, zlib 1.2.7;
- : cppunit 1.12.1, dprof 1.3, gdb 7.2, perf 3.5.7;
- : anjuta 2.32.1.1, glade 2.12.0, glade 3.5.1, qt‑creator 2.7.1;
- : bzr 2.2.4, cvs 1.11.22, git 1.8.0, patch 2.7, subversion 1.7.7.
Novamente, se você esperava GCC 5, PHP 7 e Java 9, esses são os seus problemas, como diz um jogador famoso. Nesse caso, devo também agradecer que pelo menos não o GCC 3.4.6 (LCC 1.16.12), como nas versões anteriores do sistema Elbrus, ou GCC 3.3.6 na composição do MSVS 3.0; A propósito, o compilador principal no MSVS 3.0 ainda é o GCC 2.95.4 (e por que se surpreender quando há um kernel de uma ramificação 2.4?). Comparado com a situação anterior, quando foi possível encontrar um bug do GCC corrigido no upstream há dez anos, o novo sistema tem condições quase paradisíacas - você pode até deslizá-lo no C ++ 11 se não quiser manter a compatibilidade com versões anteriores.O surgimento do OpenJDK, pelo menos de alguma forma, já pode ser chamado de um grande avanço, porque não gosta de Java e Mono.em tais sistemas é conhecido há muito tempo; e essa aversão pode ser entendida quando mesmo os programas nativos mal se movem. Como existem muitos Javistas entre os colegas do autor, devido às circunstâncias acima, forçados a restringir os maravilhosos impulsos da alma, foi decidido dedicar uma série separada de testes de desempenho para dedicar o Java. Olhando para o futuro, observamos que os resultados foram desencorajadores, mesmo em termos relativos: com o mesmo sucesso, você pode escrever scripts interpretados em PHP ou Python, provavelmente.O suporte apenas a C e C ++ não se limita à compatibilidade com o GNU Compiler Collection: o sistema ainda possui um tradutor Fortran. Como o autor conhece apenas o professor Fortran, qualquer pessoa interessada pode recomendar o tópico de dezembro sobre "Feito conosco", onde os comentários tocam no uso desse idioma como referência.Para a sobremesa, estocamos as mais deliciosas: a última parte do artigo é dedicada ao estudo do desempenho da Elbrus em comparação com uma variedade de plataformas de hardware e software, incluindo as domésticas.