# Stream Processor. Entenda mais sobre este Assunto.
Como o pessoal tem muitas dúvidas neste assunto, gostaria de falar mais sobre Stream Processors, uma ótima tecnologia que surgiu a poucos anos no mundo da informática.
Stream Processors é a tecnologia que veio para substituir os antigo Pipelines (ROPS).
Antigamente os processos de Pixel Shader e Vertex Shader eram feito de modo separado. O Pipeline ou processava somente Pixel Shader, ou somente Vertex Shader.
As unidades de Vertex só processavam vértices, as de pixel apenas aplicavam shaders em pixels.
O problema deste modelo é que as aplicações podem exigir mais operações de Pixel que Vertex shader e vice-versa. E deste modo acontece de haver ociosidade do conjunto para o processo de instruções. O jogo (ou quaisquer aplicação gráfica) tem uma implementação diferente, alguns dependendo mais das unidades de vértice, enquanto outros saturam as de pixel.
Então os fabricantes de placa de vídeo precisavam ficar adivinhando, qual seria o balanceamento mais correto (vértice x pixel) para haver maior desempenho da placa.
Com o surgimento dos Stream Processors este conceito mudou, pois em vez de trabalhar separadamente, ele unificou em paralelo o tratamento de vértices e pixels, ou seja, um stream processor pode tanto processar Pixel Shader, como processar Vertex Shader.
?? a famosa tecnologia de Shaders Unificados.
Nesta imagem podemos ver bem como isto funciona:
Com esta flexibilidade, o fabricante de GPU não tem mais preucupação com a proporção (Vertex /Pixel), ele vai se preucupar apenas em forneçer o maior número possível de unidades programáveis(stream processors)
E para o desenvolvedor de jogos vai poder livremente decidir quantas unidades quer para cada função. E terá toda liberdade de escolher o melhor algoritimo para seu software.
Este é um conceito inteligente, e abre uma enorme quantidade de opções. Como cada processador de stream (Stream Processor) é programável, podemos utilizar ele para outras finalidades além do processamento de vértices e pixels, como cálculos de fisica, aplicação de Antialiasing na imagem, etc.
Já foi comprovado que o processador principal do sistema (CPU) não é eficiente para o calculo de física, com esta nova abordagem poderemos usar alguns stream processors para esta função e nisto reduzir e muito o uso do CPU nas aplicações 3D. Com isto o CPU estará livre para processar somente scripts, lógica, IA do jogo. Isto aumentará consideravelmente o desempenho dos jogos, e diminuirá ou extiguirá com gargalos existentes entre CPU e Placa de vídeo.
Então resumindo.
Os stream processors é uma nova tecnologia que trouxe benefícios para o processamento unificado de shaders.
Agora vamos ver como os Stream Processors são tratados na arquitetura de placas da ATI (Apartir do RV770) e na Nvidia(Apatir do GT200).
Umas da novas arquiteturas da ATI é a RV770. O processador contem 10 núcleos SIMD, cada um com 16 unidades de Stream Processor(SP). Os Núcleos SIMD são similiares aos Cluster Processor Texture(TPC) da Nvidia,(A arquitetura GT200 possuem 10 desses), e então 10*16 = 160SP(RV770) é a chamada "Execução de fases em granularidade", que é similiar aos Stream processors da Nvidia (GT200 tem 240 desses).
O modelo de processo da Nvidia executa somente 1 intrução por fase, cada Stream Processor da arquitetura RV770 executa um compactado de 5 instruções wide VLIW, ou como comumente chamado 5 SPUs.
Vou explicar melhor isto:
Em cada Stream Processor da ATI temos 5 ALUs(Arithmetic logic unit), cada um tem capacidade de entregar 1 instrução por pulso de clock. Geralmente eles não todos usados, até em aplicações muito pesadas como benchmarks, temos uma média de 4.2 intruções por ciclo.
O único programa que até hoje conseguiu usar de maneira perfeita as 5 ALUs dos Stream processors foi o Matrix Multiply. No qual se mostrou todo o potencial dos Stream processors da Arquitetura da ATI.
Então apatir disto é que vemos pessoas dizendo que as placas da ATI tem 800 Stream Processors, por causa da seguinte conta:
10 SIMD * 16 SP * 5-Wide VLIW = 800 Stream Processors.


A última arquitetura da Nvidia chamada GT200 (GT significa Graphics Tesla), o processador contém 10 Texturas/Processors Clusters (TPC), cada um com 3 Single Program Muliple Data(SPDM) computando em núcleos os quais a Nvidia chama de Streaming Multiprocessors(SM). Cada um tem duas portas (Chamadas Port 0 e Port 1).
A cada porta pode realizar instruções entre 1 e 3 agrupamentos de unidades com sua fucionalidades em qualquer ciclo.
Cada agrupamento contem:
1 SIMT (Single Intruction Multiple Thread) para cada 8 Unidades de ponto flutuante, marketadas como "Stream Processors" ou como Shader cores.
Resumindo: 8 caminhos gerenciando a execução do SIMT.
Então o cáculo de stream processors da Nvidia é feito da seguinte forma:
10 TPC * 3 (SPDM) * 8 (SIMT) = 240 Stream Processors.
Considerando um teórico número de 800SP da ATI, na prática é diferente. Porque como citei anteriormente o uso das ALUs é comumente não usado da forma adequada, somente 1 software até hoje conseguiu usar as ALUs na forma teórica, e sim neste software podemos dizer que a ATI possuiu um fator de 800 contra 240 da Nvidia.
Um site francês(não consegui mais achar o link) fez comparação entre os SP da ATI e da Nvidia, e chegou a conclusão, em uma média comparando vários jogos e aplicações, e chegou-se na conclusão que aproximadamente para termos o desempenho da ATI para Nvidia somente em Stream Processors deveríamos fazer a Razão/Proporção de 5/2. Dividindo os Streams Processors da ATI por 5, e da Nvidia por 2. Devemos fazer isto justamente porque não se pode considerar o uso total dos Stream Processors da ATI(que na teoria serião de 800 e 240 da ATI) na prática consideraram 160SP(RV770) da ATI contra 120SP da Nvidia(GT200) fazendo uma média de todos os jogos, aplicações e benchmarks em geral.
Isto deve mudar com a nova implantação de física da ATI em suas GPUs com o novo Havok FX. O qual irá fazer mais usos das Stream Processors(diminuindo esta Razão/proporção) em vantagem para a arquitetura da ATI.
Porém estamos aqui falando de arquitetura, então não podemos somente falar de Stream processors, eles não significam tudo em uma placa de vídeo. Eles são somente uma parte importante no processo, no qual temos outras 2 no mesmo nível de importância. Vamos analisar os outros fatores:
Há três especificações que são as mais determinantes de desempenho de uma placa de vídeo.
Uma é tão importante quanto a outra.
São
-> Fillrate (Capacidade Bruta da placa de vídeo em processar pixels e texturas e escrevê-los na memória)
?? dividido em 2.
-Pixel Fillrate (?? formado pelo número de ROPs[pixel pipelines] * Clock da GPU) {Resultado em MegaPixels/s, ou MPixels/s}
-Texture Fillrate (?? formado pelo número de TMU[Unidades de processamento de textura] * Clock da GPU) {Resultado em MegaTexels/s ou MTexels/s}
PS: Porém aqui o mais importante a se considerar é o Texture Fillrate.. já que o Pixel Fillrate está sendo
bastante substituído pelos StreamProcessors
OBS: Aqui a Nvidia supera a ATI em qualquer arquitetura(Texture Fillrate). ?? aqui que ela consegue seus aumentar seu FPS, perante os Stream Processor da ATI.
-> Memory Bandwidth (Taxa de transferência da memória)
?? formado pela seguinte fórmula: [largura da banda(em bits) * Clock da memória] / 8 / 1000 {resultado em GB/S}
-> Stream Processors (Capacidade de processamento de Efeitos de Pixel Shader e Vertex Shader, e efeitos de AF, AA e física).
Nas placas da ATI usa-se o fator 5 para a razão e proporção com a nvidia
Nas placas da Nvidia usa-se o fator 2 para a razão e proporção com a ati
Então, terminado este Assunto, não podemos pensar que Stream processors somente são determinantes.
E eu falei muito sobre Vertex e Pixel shader, porém o que é cada um deles?
Pixel Shader
Pixel Shader é usado para aplicar a cor e outros atributos para cada pixel.
Ele é frequentemente usado para aplicar efeitos de luminosidade, de sombras, Blur e efeitos complexos como Specular Highlights, Bump Mapping e Depth of field.
Efeitos de luminosidade
Com e sem pixel shader.
Specular highlight
Bump mapping
Sem Bump Mapping:
Com Bump Mapping:
Sem e Com Bump Mapping (Fallout 3)
Translucency
Efeito Blur

(Efeito blur no Spore, fazendo as distâncias muito mais realistas).
Sombras com Depth of field(DOF)

(OBS: Depth of Field é uma técnica que visa embassar o que não é necessário em uma imagem, aplicando-se no efeito 3D, além de embassar objetos que(no caso da foto) não estão na mira, embassa objetos distantes que mesmo estando perto da mira(no aspecto 2D), estão longe da mira(no aspecto 3D).
PS: Imagem do jogo Crysis.
Mais sobre Depth of Field:
http://en.wikipedia.org/wiki/Depth_of_field
Vertex Shader
Ele é interessante para ocasiões onde se tem muita geometria complexa e neste caso vamos substuir o tratamento normalmente feito com texturas por Vertex Shader.
Por exemplo, os pelos de um cachorro.. se formos tratar isto com texturas todos os pelos ficaram com uma configuração 2D pois seria uma geometria muito complexa para se tratar com 3D. Porém com o Vertex Shader podemos tratar todos os pelos como forma de polígonos e com operações simples.
Os vertex shaders trabalham na estrutura dos objetos 3D que compõe a imagem, adicionando efeitos e criando animações, como no caso da grama ou dos cabelos.
Também são muito usados para contrução de terrenos muito complexos. E muito usado em efeitos como Parallax Occlusion Mapping (POM).
Você pode reparar que a maioria dos jogos tem o terreno com retas, e quadrados.. estes não usam Vertex Shader.
Porém quando você ver terrenos complexos, estes irão ter que usar muitos polígonos, ou seja, Vertex Shader.
Sem contar com uma implementação que vem sendo muito feita nos últimos tempos que é a abordagem Vertex Textures. Apartir do momento que outros componentes da VGA terminam a textura, a nova programação do Vertex Shader consegue ler a textura assim como pixel shader faz.
Apartir do momento que ele traça toda a textura ele edita vários vértices da textura e a transforma em um polígono.
Esta nova programação vem sendo muito usada para se fazer efeitos com fluídos, simulação real do oceano, explosões, partículas, etc..
Hair Polygonal
Grass polygonal
Terrenos
Outro exemplo de terreno feito em vertex Shader
Parallax Occlusion Mapping (POM)
Os terrenos de Crysis são tão perfeitos por causa do POM, que é processado no Stream Processors.
Mais sobre POM:
http://en.wikipedia.org/wiki/Parallax_mapping
Exemplo de Vertex Texture que é muito usado em jogos com oceano (Crysis por exemplo com seu algoritimo Fast Fourier Transform)
O Fast Fourier Transform(Vertex Texture) é um algoritimo que é usado junto ao Vertex Shader que foi implementado ao Crysis.
Ele cria ondas na água, e faz a água interagir com outros objetos(tipo a água levar um graveto por exemplo)
http://en.wikipedia.org/wiki/Fast_Fourier_transform
Sem vertex shader, nada mais complexo em termos de polígonos poderia existir.
E sem Pixel shader nada mais complexo em termos de cor e luminosidade poderia exisitir.
Espero que tenham gostado. Abraço!
O que são STREAM PROCESSORS?
Stream Processors é a tecnologia que veio para substituir os antigo Pipelines (ROPS).
Antigamente os processos de Pixel Shader e Vertex Shader eram feito de modo separado. O Pipeline ou processava somente Pixel Shader, ou somente Vertex Shader.
As unidades de Vertex só processavam vértices, as de pixel apenas aplicavam shaders em pixels.
O problema deste modelo é que as aplicações podem exigir mais operações de Pixel que Vertex shader e vice-versa. E deste modo acontece de haver ociosidade do conjunto para o processo de instruções. O jogo (ou quaisquer aplicação gráfica) tem uma implementação diferente, alguns dependendo mais das unidades de vértice, enquanto outros saturam as de pixel.
Então os fabricantes de placa de vídeo precisavam ficar adivinhando, qual seria o balanceamento mais correto (vértice x pixel) para haver maior desempenho da placa.
Com o surgimento dos Stream Processors este conceito mudou, pois em vez de trabalhar separadamente, ele unificou em paralelo o tratamento de vértices e pixels, ou seja, um stream processor pode tanto processar Pixel Shader, como processar Vertex Shader.
?? a famosa tecnologia de Shaders Unificados.
Nesta imagem podemos ver bem como isto funciona:
Com esta flexibilidade, o fabricante de GPU não tem mais preucupação com a proporção (Vertex /Pixel), ele vai se preucupar apenas em forneçer o maior número possível de unidades programáveis(stream processors)
E para o desenvolvedor de jogos vai poder livremente decidir quantas unidades quer para cada função. E terá toda liberdade de escolher o melhor algoritimo para seu software.
Este é um conceito inteligente, e abre uma enorme quantidade de opções. Como cada processador de stream (Stream Processor) é programável, podemos utilizar ele para outras finalidades além do processamento de vértices e pixels, como cálculos de fisica, aplicação de Antialiasing na imagem, etc.
Já foi comprovado que o processador principal do sistema (CPU) não é eficiente para o calculo de física, com esta nova abordagem poderemos usar alguns stream processors para esta função e nisto reduzir e muito o uso do CPU nas aplicações 3D. Com isto o CPU estará livre para processar somente scripts, lógica, IA do jogo. Isto aumentará consideravelmente o desempenho dos jogos, e diminuirá ou extiguirá com gargalos existentes entre CPU e Placa de vídeo.
Então resumindo.
Os stream processors é uma nova tecnologia que trouxe benefícios para o processamento unificado de shaders.
Agora vamos ver como os Stream Processors são tratados na arquitetura de placas da ATI (Apartir do RV770) e na Nvidia(Apatir do GT200).
Arquitetura ATI (RV770)
Umas da novas arquiteturas da ATI é a RV770. O processador contem 10 núcleos SIMD, cada um com 16 unidades de Stream Processor(SP). Os Núcleos SIMD são similiares aos Cluster Processor Texture(TPC) da Nvidia,(A arquitetura GT200 possuem 10 desses), e então 10*16 = 160SP(RV770) é a chamada "Execução de fases em granularidade", que é similiar aos Stream processors da Nvidia (GT200 tem 240 desses).
O modelo de processo da Nvidia executa somente 1 intrução por fase, cada Stream Processor da arquitetura RV770 executa um compactado de 5 instruções wide VLIW, ou como comumente chamado 5 SPUs.
Vou explicar melhor isto:
Em cada Stream Processor da ATI temos 5 ALUs(Arithmetic logic unit), cada um tem capacidade de entregar 1 instrução por pulso de clock. Geralmente eles não todos usados, até em aplicações muito pesadas como benchmarks, temos uma média de 4.2 intruções por ciclo.
O único programa que até hoje conseguiu usar de maneira perfeita as 5 ALUs dos Stream processors foi o Matrix Multiply. No qual se mostrou todo o potencial dos Stream processors da Arquitetura da ATI.
Então apatir disto é que vemos pessoas dizendo que as placas da ATI tem 800 Stream Processors, por causa da seguinte conta:
10 SIMD * 16 SP * 5-Wide VLIW = 800 Stream Processors.


Arquitetura Nvidia (GT200)
A última arquitetura da Nvidia chamada GT200 (GT significa Graphics Tesla), o processador contém 10 Texturas/Processors Clusters (TPC), cada um com 3 Single Program Muliple Data(SPDM) computando em núcleos os quais a Nvidia chama de Streaming Multiprocessors(SM). Cada um tem duas portas (Chamadas Port 0 e Port 1).
A cada porta pode realizar instruções entre 1 e 3 agrupamentos de unidades com sua fucionalidades em qualquer ciclo.
Cada agrupamento contem:
1 SIMT (Single Intruction Multiple Thread) para cada 8 Unidades de ponto flutuante, marketadas como "Stream Processors" ou como Shader cores.
Resumindo: 8 caminhos gerenciando a execução do SIMT.
Então o cáculo de stream processors da Nvidia é feito da seguinte forma:
10 TPC * 3 (SPDM) * 8 (SIMT) = 240 Stream Processors.
Arquitetura Nvidia vs ATI
Considerando um teórico número de 800SP da ATI, na prática é diferente. Porque como citei anteriormente o uso das ALUs é comumente não usado da forma adequada, somente 1 software até hoje conseguiu usar as ALUs na forma teórica, e sim neste software podemos dizer que a ATI possuiu um fator de 800 contra 240 da Nvidia.
Um site francês(não consegui mais achar o link) fez comparação entre os SP da ATI e da Nvidia, e chegou a conclusão, em uma média comparando vários jogos e aplicações, e chegou-se na conclusão que aproximadamente para termos o desempenho da ATI para Nvidia somente em Stream Processors deveríamos fazer a Razão/Proporção de 5/2. Dividindo os Streams Processors da ATI por 5, e da Nvidia por 2. Devemos fazer isto justamente porque não se pode considerar o uso total dos Stream Processors da ATI(que na teoria serião de 800 e 240 da ATI) na prática consideraram 160SP(RV770) da ATI contra 120SP da Nvidia(GT200) fazendo uma média de todos os jogos, aplicações e benchmarks em geral.
Isto deve mudar com a nova implantação de física da ATI em suas GPUs com o novo Havok FX. O qual irá fazer mais usos das Stream Processors(diminuindo esta Razão/proporção) em vantagem para a arquitetura da ATI.
Porém estamos aqui falando de arquitetura, então não podemos somente falar de Stream processors, eles não significam tudo em uma placa de vídeo. Eles são somente uma parte importante no processo, no qual temos outras 2 no mesmo nível de importância. Vamos analisar os outros fatores:
Há três especificações que são as mais determinantes de desempenho de uma placa de vídeo.
Uma é tão importante quanto a outra.
São
-> Fillrate (Capacidade Bruta da placa de vídeo em processar pixels e texturas e escrevê-los na memória)
?? dividido em 2.
-Pixel Fillrate (?? formado pelo número de ROPs[pixel pipelines] * Clock da GPU) {Resultado em MegaPixels/s, ou MPixels/s}
-Texture Fillrate (?? formado pelo número de TMU[Unidades de processamento de textura] * Clock da GPU) {Resultado em MegaTexels/s ou MTexels/s}
PS: Porém aqui o mais importante a se considerar é o Texture Fillrate.. já que o Pixel Fillrate está sendo
bastante substituído pelos StreamProcessors
OBS: Aqui a Nvidia supera a ATI em qualquer arquitetura(Texture Fillrate). ?? aqui que ela consegue seus aumentar seu FPS, perante os Stream Processor da ATI.
-> Memory Bandwidth (Taxa de transferência da memória)
?? formado pela seguinte fórmula: [largura da banda(em bits) * Clock da memória] / 8 / 1000 {resultado em GB/S}
-> Stream Processors (Capacidade de processamento de Efeitos de Pixel Shader e Vertex Shader, e efeitos de AF, AA e física).
Nas placas da ATI usa-se o fator 5 para a razão e proporção com a nvidia
Nas placas da Nvidia usa-se o fator 2 para a razão e proporção com a ati
Então, terminado este Assunto, não podemos pensar que Stream processors somente são determinantes.
E eu falei muito sobre Vertex e Pixel shader, porém o que é cada um deles?
Pixel Shader e Vertex Shader
Pixel Shader
Pixel Shader é usado para aplicar a cor e outros atributos para cada pixel.
Ele é frequentemente usado para aplicar efeitos de luminosidade, de sombras, Blur e efeitos complexos como Specular Highlights, Bump Mapping e Depth of field.
Efeitos de luminosidade
Com e sem pixel shader.
Specular highlight
Bump mapping
Sem Bump Mapping:
Com Bump Mapping:
Sem e Com Bump Mapping (Fallout 3)
Translucency
Efeito Blur

(Efeito blur no Spore, fazendo as distâncias muito mais realistas).
Sombras com Depth of field(DOF)

(OBS: Depth of Field é uma técnica que visa embassar o que não é necessário em uma imagem, aplicando-se no efeito 3D, além de embassar objetos que(no caso da foto) não estão na mira, embassa objetos distantes que mesmo estando perto da mira(no aspecto 2D), estão longe da mira(no aspecto 3D).
PS: Imagem do jogo Crysis.
Mais sobre Depth of Field:
http://en.wikipedia.org/wiki/Depth_of_field
Vertex Shader
Ele é interessante para ocasiões onde se tem muita geometria complexa e neste caso vamos substuir o tratamento normalmente feito com texturas por Vertex Shader.
Por exemplo, os pelos de um cachorro.. se formos tratar isto com texturas todos os pelos ficaram com uma configuração 2D pois seria uma geometria muito complexa para se tratar com 3D. Porém com o Vertex Shader podemos tratar todos os pelos como forma de polígonos e com operações simples.
Os vertex shaders trabalham na estrutura dos objetos 3D que compõe a imagem, adicionando efeitos e criando animações, como no caso da grama ou dos cabelos.
Também são muito usados para contrução de terrenos muito complexos. E muito usado em efeitos como Parallax Occlusion Mapping (POM).
Você pode reparar que a maioria dos jogos tem o terreno com retas, e quadrados.. estes não usam Vertex Shader.
Porém quando você ver terrenos complexos, estes irão ter que usar muitos polígonos, ou seja, Vertex Shader.
Sem contar com uma implementação que vem sendo muito feita nos últimos tempos que é a abordagem Vertex Textures. Apartir do momento que outros componentes da VGA terminam a textura, a nova programação do Vertex Shader consegue ler a textura assim como pixel shader faz.
Apartir do momento que ele traça toda a textura ele edita vários vértices da textura e a transforma em um polígono.
Esta nova programação vem sendo muito usada para se fazer efeitos com fluídos, simulação real do oceano, explosões, partículas, etc..
Hair Polygonal
Grass polygonal
Terrenos
Outro exemplo de terreno feito em vertex Shader
Parallax Occlusion Mapping (POM)
Os terrenos de Crysis são tão perfeitos por causa do POM, que é processado no Stream Processors.
Mais sobre POM:
http://en.wikipedia.org/wiki/Parallax_mapping
Exemplo de Vertex Texture que é muito usado em jogos com oceano (Crysis por exemplo com seu algoritimo Fast Fourier Transform)
O Fast Fourier Transform(Vertex Texture) é um algoritimo que é usado junto ao Vertex Shader que foi implementado ao Crysis.
Ele cria ondas na água, e faz a água interagir com outros objetos(tipo a água levar um graveto por exemplo)
http://en.wikipedia.org/wiki/Fast_Fourier_transform
Sem vertex shader, nada mais complexo em termos de polígonos poderia existir.
E sem Pixel shader nada mais complexo em termos de cor e luminosidade poderia exisitir.
Espero que tenham gostado. Abraço!
