Infra - Linux

PlayStation 3 - Um brinquedo de gente grande...

Neste documento veremos de forma simples e objetiva, como efetuar uma compilação cruzada gerando um programa HelloWord para o famoso console PlayStation 3. A distribuição utilizada foi o OpenSuSE 10.3 e o equipamento foi um modesto PC de 32 bits.

por Alessandro de Oliveira Faria



Um dia terei um PlayStation 3, o CELL que quebrou os paradigmas apresentando a sua nova arquitetura. Diferente da tecnologia multi-núcleo que executam as mesmas tarefas, o CELL é composto de núcleos especializados que dividem a tarefa computacional. GPU integrado a CPU, e o acesso a memória de maneira inédita, apresentam resultados impressionantes.



Agradecimentos:

Agradeço a colaboração do Marcus Fazzi pela ajuda nos testes de execução do programa HelloWord no PlayStation 3. Para quem deseja instalar o Linux em seu PS3, sugiro consultar os procedimentos de instalação do Linux em PlayStation 3, o link Linzzi possui todos os passos para tal tarefa. Para quem desconhece, Linzzi é uma variação do Gentoo para o PlayStation 3 com Kernel 2.6.XX (com patches da Sony), KDE 3.5.5 e outros recursos mencionado na página do projeto.

Já os adoradores do OpenSuSE podem acessar diretamente a distribuição para o PS3 em:
http://en.opensuse.org/PS3

Arquitetura:

Fonte: http://dcon.com.br/jd.comment/home_full.php

O processador é um dos componentes mais importantes do computador, pois o seu poder é que define a característica do equipamento como um todo. É o processador que determina o desempenho e performance do aparelho, portanto conhecer o que existe por trás de um processador é fundamental e obrigatório a todos o desenvolvedores de aplicações. Pois só conhecendo o equipamento, pode-se escrever códigos com o melhor resultado desejado.

Conforme a lei de Moore, velozes processadores de 64 bits, processadores com multi-núcleo e CPUS integradas são o que temos na vanguarda do mercado. O processador CELL BE (conhecido como o processador de 9 núcleos) chegou para fazer a diferença, pois a sua arquitetura difere-se do modelos convencionais de processadores no mercado.

O que CELL?



Cell é o nome atribuído para uma arquitetura de microprocessador desenvolvida numa joint-venture entre a Sony, Toshiba e IBM. Do projeto da arquitetura até a primeira implementação foram gastos quatro anos, começando em Março de 2001, num custo estimado pela IBM de 400 milhões de dólares.

Este novo processador, baseado na arquitetura Power 64 bits, suporta todo o legado do Power, PowerPC de 32 e 64 bits.

A utilização inicial deste processador foi destinada ao console de jogos PlayStation 3 da Sony. Porém a sua aplicabilidade é infinita. Dos pequenos computadores com aplicações para manipulação de vídeo até as plataformas altas (mainframes). Hoje os novos servidores IBM Blade QS20 para computação de alta-performance utilizam CELL BE, ainda na IBM mainframes receberão processadores CELL BE integrados por meio de adaptadores PCI. No dia-a-dia dos consumidores finais, aparelhos de televisão digital, media-centers, aparelhos com "Blue-ray" e dispositivos embarcados serão fabricados com processador CELL BE.

Como funciona a criança?



Os núcleos: A primeira característica marcante no processador CELL BE é sua divisão interna. Ele possui 9 núcleos de processamento, algo absolutamente inovador e sem comparativos no mercado atual. Destes 9 núcleos, 8 são SPEs e 1 PPE.

PPE: "Power Processor Element", é um processador PPC de 64 bits ("dual thread") que funciona tanto em 64bits quanto em 32bits. Possui um cache L1 de 32Kbytes e um cache L2 de 512Kbytes. O PPE é responsável pela direta comunicação com o sistema operacional, divisão de tarefas (para si, e para os SPEs) e alocação de recursos. Ele é otimizado para o processamento intensivo de tarefas.

SPE: "Synergistic Processor Element" são os processadores de núcleo RISC especializados em computação vetorial, ou seja, o processamento de uma mesma instrução para um grupo de dados em um vetor (Também chamado de Single Instruction Multiple Data, SIMD). Os núcleos SPE foram desenvolvidos para suportarem programação de alto nível (como C/C++) com instruções específicas relacionadas a manipulação de conteúdo rico, ou seja, computação gráfica de áudio, jogos, novos métodos de interação homem-máquina. O SPEs são otimizados para o processamento intensivo de dados computacionais.

Dessa forma os 9 núcleos do processador oferecem ao desenvolvedor de aplicações uma plataforma multi-processada com suporte real computação paralela.

Ambos PPE e SPE são dependentes um do outro, uma vez que o PPE está mais ligado ao controle de tarefas do Sistema Operacional e portanto direciona o fluxo de dados inicial de processamento, já os SPEs são independentes no que tange o processamento. Eles são capazes de executar seus próprios programas e threads ao mesmo tempo que outro SPE está rodando um programa diferente.

Cada SPE tem completo acesso a memória (shared memory) através de um controlador DMA para cada SPE, isso permite o fluxo simultâneo de dados entre memória e processador independente e ao mesmo tempo que os outros processadores. O método de acesso a memória dos núcleos SPE são a maior diferença em relação ao PPE e é a grande inovação presente no processador CELL BE, uma vez que com este recurso o ciclo de máquina permite uma execução de instruções mais rápida em com maior conteúdo vindo da memória.

EIB:

O EIB é o caminho de comunicação de comandos e dados entre os núcleos dos 8 processadores e os controladores de memória e I/O, pelo qual os núcleos do processador podem fazer acesso de leitura e gravação simultâneamente e independente da ação de outro núcleo. O EIB suporta completo acesso as áreas de memória e operações multi-processadas simétricas. Com este desenho o processador CELL BE está otimizado para construção de clusters de processadores.

MIC:

Outra parte do processador a ser detalhada é o MIC, "Memory Interface Controller". Trata-se de um dispositivo "on chip" responsável pela interface de controle de memória entre o EIB e a memória física a ser utilizada pelo processador. O MIC suporta até duas interfaces Rambus XDR que juntas podem variar de 64 Mbytes até 64 Gbytes de memória DRAM.

BEI:

A última parte a ser apresentada é a explicação do BEI, "Broadband Engine Interface", a área responsável pela comunicação com os dispositivos de entrada e saída. O BEI é composto por 3 interfaces de controle de I/O:
  • BIC, "Broadband Interface Controler"
  • IOC, "Input Output Controller"
  • IIC, "Internal Interrupt Controller"
Estas 3 interfaces juntas permitem o gerenciamento de transferência de dados entre o EIB e os dispositivos de entrada e saída de dados, bem como a tradução dos endereços de tais dispositivos e o processamento de comandos relacionados aos mesmos.

Instalando os pacotes e compilando o Hello Word para o PS3.

No seu sistema OpenSuse 10.3, abra o Yast e selecione na seção "SOFTWARE" o item "Gestão de Software". A seguir no listbox "FILTRO", selecione a opção PADROES. Agora basta selecionar o grupo Desenvolvimento Cell, clicar no botão ACEITAR e aguardar a conclusão da instalação.



Ao terminar, o YAST instalou os seguintes pacotes o seu sistema OpenSuse:
  • cross-spu-binutils - Ferramentas GNU binutils para o desenvolvimento;
  • cross-spu-gcc - O compilador GNU C para o processador Cell SPU;
  • cross-spu-newlib - Biblioteca GNU C.
HelloWord.c para Playstation 3

Crie o seu primeiro HelloWord.c para o PlayStation 3 com o conteúdo abaixo:
#include <stdio.h>
typedef union
{
    unsigned long long ull;
    unsigned int ui[2];
}addr64;

int main(unsigned long long speid, addr64 argp, addr64 envp) 
{
    printf("Hello world, para o PlayStation 3!\n");
    return 0;
} 
A compilação será executada em duas fases (criação do código objeto e binário). Abaixo o comando para compilar o código-fonte gerando o objeto do mesmo.

$ spu- gcc -W -Wall -Winline -Wno-main -I. -I /opt/cross/spu/sys-root/usr/include/ -include spu_intrinsics.h -O3 -c helloword.c

A seguir a sintaxe para criar o código binário (executável) utilizando a biblioteca libc estática.

$ spu-gcc -o helloword helloword.o -Wl,-N /opt/cross/spu/sys-root/usr/lib/libc.a

Agora copie o executável para o PS3 com Linux e execute o programa. Abaixo os resultados efetuado pelo Marcus Fazzi.

$ ./helloword
Hello world, para o PlayStation 3!

$ file helloword
hello_spu: ELF 32-bit MSB executable, Cell SPU, version 1 (SYSV), statically linked, not stripped

$ uname -a
Linux Nakoruru 2.6.23-ps3 #1 SMP Wed Dec 19 20:36:55 UTC 2007 ppc64 Cell Broadband Engine, altivec supported GNU/Linux

Fácil não? Agora basta um pouco de pesquisa e um PS3, para utilizar todo o poder de fogo do Software Livre nesta máquina criada para voar...



"Colaborar atrai amigos, competir atrai inimigos...
Use a força, LEIA OS FONTES!"
Alessandro de Oliveira Faria

Alessandro de Oliveira Faria - Sócio-proprietário da empresa NETi TECNOLOGIA fundada em Junho de 1996 (http://www.netitec.com.br), empresa especializada em desenvolvimento de software e soluções biométricas, Consultor Biométrico na tecnologia de reconhecimento facial, atuando na área de tecnologia desde 1986 assim propiciando ao mercado soluções em software nas mais diversas linguagens e plataforma, levando o Linux a sério desde 1998 com desenvolvimento de soluções open-source, membro colaborador da comunidade Viva O Linux, mantenedor da biblioteca open-source de vídeo captura entre outros projetos.