Qual é a diferença entre programação serial e programação de plataforma paralela com um thread?

Eu diria que a principal diferença estará em como você escreve seu código. Se você espera trabalhar com um único encadeamento, seu código é muito mais simples do que no caso de programação paralela, pois seu principal objetivo é a computação maciçamente simultânea. Você fica com a execução seqüencial e não pensa duas vezes, no entanto, é muito improvável que você queira executar o código destinado à computação paralela em um único núcleo com um único encadeamento.

A programação simultânea é um caso diferente, que é subjetivamente mais provável de ser executado em um único encadeamento, em vez disso, por exemplo, em dois ou quatro encadeamentos. Nesse cenário, o código que você escreveu possivelmente possui uma sobrecarga adicional em pontos, onde você precisa garantir acesso seqüencial a determinados blocos de código. Nesses casos, você pode ter usado mutexes ou semáforos para obter a sincronização de seus vários threads e, como você deve saber, essas operações são caras mesmo se você tiver um único thread, que não precisará coordenar com outros threads.

No geral, se você escreve um código que deve ser executado em paralelo, mas acontece que você tem apenas um encadeamento, presumivelmente se esforçou bastante para escrever um bom código escalável e eficiente que lida com os problemas do uso de vários encadeamentos, mas foi tudo por nada. É ainda pior, porque você terá uma sobrecarga inútil por causa das alternâncias de contexto entre seus “threads” que são na verdade um único thread; portanto, ambos os paradigmas de programação, sejam simultâneos ou paralelos, sofrerão com isso.