O título diz tudo: existe uma maneira de obter um programa mais antigo projetado para usar um único núcleo de CPU para usar vários núcleos de CPU?
O título diz tudo: existe uma maneira de obter um programa mais antigo projetado para usar um único núcleo de CPU para usar vários núcleos de CPU?
Respostas:
Infelizmente, um programa legado criado para uma única CPU não pode ser forçado a usar vários núcleos de CPU. O uso de vários núcleos da CPU requer vários encadeamentos, que precisam se comunicar entre si, garantindo que as condições de corrida e outros problemas não ocorram. Um aplicativo mais antigo não pode ser feito para usar mais do que o núcleo da CPU, a menos que seja reescrito para fazê-lo, e somente se a natureza do aplicativo permitir que ele seja paralelo.
Qual é o seu objetivo com isso? Maior desempenho? Infelizmente, os aplicativos projetados para usar apenas 1 núcleo não farão uso de mais. É disso que se trata essa conversa sobre aplicativos "multiencadeados".
Existem pelo menos três técnicas para explorar vários processadores em um programa projetado para usar um único núcleo. A mais simples dessas técnicas é usar bibliotecas e código do sistema que usa vários núcleos ou pode executar pelo menos parcialmente em paralelo com o código do aplicativo. A coleta de lixo é um exemplo de funcionalidade que pode ser paralelizada e pode ser possível paralelamente à execução do aplicativo. Mesmo sem o gerenciamento automático de memória, existe algum potencial de paralelismo nas funções de desalocação de memória, porque o alocador de memória pode ter algum trabalho a fazer além de simplesmente marcar a seção de memória como disponível.
Uma segunda técnica é a tradução binária. Embora isso possa ser considerado "reescrever o aplicativo", isso é feito por software e sem acesso ao código-fonte. A produção de paralelismo em nível de encadeamento parece não ter sido o principal objetivo da maioria das pesquisas e desenvolvimento usando a tradução binária (que geralmente envolve a execução de código legado em um ISA diferente, a exploração de extensões ISA ou a otimização para uma microarquitetura específica e o uso de informações dinâmicas para fornecer maior otimização guiada por perfil de qualidade), mas o potencial é óbvio.
Uma terceira técnica é a multithreading especulativa. Atualmente, nenhum processador (que eu conheça) suporta multithreading especulativo gerenciado por hardware. No entanto, com a introdução da memória transacional de hardware, a implementação de um sistema de tempo de execução torna-se um pouco mais prática, pois o HTM pode ser usado para detectar conflitos no uso da memória. O multithreading especulativo gerenciado por software normalmente envolve alguma tradução binária, mas sua natureza especulativa justifica considerar uma técnica separada.
A praticidade dessas técnicas é limitada pelos custos associados aos sistemas existentes (incluindo o custo da comunicação entre os threads e dos threads de desova), pelo paralelismo limitado que eles podem explorar e pelo retorno limitado do investimento (aplicativos importantes que podem ser benéficos Se em paralelo for provável que seja reescrito, muitos aplicativos se beneficiariam relativamente pouco, se é que utilizam essas técnicas (especialmente com limites de energia / térmica que permitem que um único núcleo seja executado em uma frequência mais alta que vários núcleos) e os custos de desenvolvimento são significativos). No entanto, essas técnicas fazem existir e é teoricamente possível a utilização de múltiplos núcleos com um aplicativo projetado para usar um único núcleo.
Não, não pode ser. Um programa é escrito explicitamente para usar vários núcleos. Não é trivial fazer o trabalho em vários núcleos. Requer sincronizações de todos os threads. Como um arremessa a bola, o outro pega, um lustra a bola, um limpa, um verifica a bola se ela tem uma boa quantidade de ar nela. Agora imagine cada personagem executando em um thread independentemente um do outro. Alguém tenta pegar a bola quando ela não é lançada. Ou alguém tenta polir a bola quando está sendo jogada. Ou dois personagens tentando pegar e jogar a bola simultaneamente. Existem muitas maneiras de travar. Portanto, os programadores precisam redesenhar cuidadosamente um aplicativo de núcleo único para que ele possa tirar proveito de vários núcleos.