pois eh... existem otimizacoes em relacao a um processador convencional, mas o ganho depende de vc usar essas otimizacoes corretamente.
a principal caracteristica de um DSP eh a instrucao MAC, cuja ideia eh calcular um segmento de codigo y+=k[i]*x[i] em um unico ciclo de clock. para conseguir isso, o DSP precisa de bancos de memoria separados para os operandos k[i] e x[i], de modo a transferir eles simultaneamente, em um unico clock. para apoiar isso, modos de enderecamento com auto-incremento, mascaras e loop por hardware permitem varrer arrays sem sobrecarga extra.
por exemplo:
- Código: Selecionar todos
while(i--)
{
y += (*x++)*(*k++);
}
isso em um x86 se torna algo parecido com:
- Código: Selecionar todos
mov esi,_x // carrega x
mov edi,_k // carrega k
mov ecx,_n // carrega n
loop:
lodsl eax,[esi] // eax = *k++
lodsl ebx,[edi] // ebx = *x++
mul eax,ebx // eax = eax*ebx
add edx,eax // edx += eax
loopnz loop // decrementa ecx e roda enquanto nao-zero.
alguma coisa assim. na parte do loop vc teria que transferir 2 palavras da memoria, multiplicar, somar e entao rodar o loop. como a memoria tem um path unico, no minimo vc vai usar 2 clocks para transferir duas palavras. mais 1 clock para multiplicar, mais 1 clock para somar e mais 1 para fazer o branch. usando um x86 superescalar vc poderia talvez otimizar o branch, pq ele nao depende de nenhum resultado e pode ser calculado em paralelo com a soma por ex. entao vc teria pelo menos 4 clocks por termo y+=k[i]*x[i].
bom, em um DSP hipotetico vc teria:
- Código: Selecionar todos
move x,a0 // carrega x
move k,a1 // carrega k
move n,r0 // carrega n
mac *a0+,*a1+,r1,rep r0 // while(n--) r1 += (*a0++)*(*a1++)
neste caso, as operacoes do loop correm em 1 clock.
dae vem a questao do paralelismo. no mesmo core o x86 nao vai alem do que jah temos, mas em um DSP otimizado para video eh possivel trabalhar vetorialmente. o codigo eh praticamente o mesmo, a diferenca eh que os operandos de entrada podem ser vetores. e com isso vc consegue fazer varias instrucoes MAC no mesmo clock.
daih entao vc parte para os multi-cores. e novamente os DSPs costumam estar na frente de um x86 em numero.
pegue como referencia este cara por exemplo:
http://www.freescale.com/webapp/sps/sit ... de=MSC8156
eh um six-core de 1GHz capaz de chegar a 48000 MMAC/s, ou seja, cada core consegue 8000 MMAC/s. comparativamente, um core x86 tipico de 2GHz consegue algo em torno de apenas 500MMAC/s.
mas a coisa nao para por ae, afinal o x86 tem uma unidade vetorial integrada... ou pensa que tem, nao sei. vamos pegar um caso mais realista, como o altivec do powerpc. com 1GHz ele consegue 16000 MMAC/s em teoria. chutando que o x86 tenha algo similar, um dual core x86 tipico de 2GHz poderia atingir os 64000 MMAC/s, deixando para tras os DSPs mais potentes, embora isso seja algo pouco realista: nem o powerpc, nem tao pouco o x86 possuem arquiteturas de IO e memoria capazes de aguentar o tranco para tanto processamento, sem falar que eh um tanto quanto especulativo comparar um DSP otimizado para certas aplicacoes com um processador de uso geral que eh otimizado para outras (ou que nao eh otimizado para nada).
entao, se fosse para apostar no mais eficiente e mais adequado para uma aplicacao especifica, eu apostaria no DSP.