Um programa de thread único pode ser criado para usar vários núcleos?

12

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?

Chris
fonte
13
Não, não é possível.
Moab,
5
Se apenas fosse assim tão fácil ..
Brendan Longo
1
E se houvesse um programa que 'emulasse' um processador (como talvez uma vm?), Mas pegasse sua CPU multi-core e emulasse uma CPU single-core com muito mais poder de processamento por thread? Isso é possível?
precisa
Quem gerenciará a sincronização entre vários threads então, porque a ordem é importante.
user36582

Respostas:

16

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.

bwDraco
fonte
19
Também é importante notar que alguns aplicativos simplesmente não podem ser reescritos para levar em conta vários núcleos. Depende principalmente do grau de paralelismo do processo. Um exemplo simples de processo não-paralelizável seria a reprodução humana: uma mulher pode criar um filho em 9 meses. Nove mulheres podem fazer 9 filhos em 9 meses, mas você não pode usar 9 mulheres para fabricar um único filho em um mês.
precisa saber é o seguinte
1
Em princípio, alguém poderia escrever um programa para analisar outro programa e tentar paralelizá-lo. Dito isto, mesmo versões "fáceis" muito limitadas desse problema estão gerando Ph.D. dissertações nas últimas duas gerações e o progresso tem sido lento. O problema completo pode muito bem estar completo com a IA.
dmckee --- ex-moderador gatinho
Grande, obrigado a todos, você me fez Grion com o seu exemplo Mulheres e nascimento, especialmente quando se fala de fabricação: D
Chris
e se um programa tiver várias operações matemáticas independentes que serão usadas posteriormente uma para a outra? talvez um segundo thread possa analisar o programa, hmm, não sei o que estou dizendo. Se um encadeamento puder analisar a montagem .. "faça uma operação cara aqui, faça uma segunda operação cara com isso, a primeira operação cara não toca" ok de volta à linha principal. Suponho que um programa inteiro teria que ser pré-analisado para identificar operações caras independentes.
CausingUnderflowsEverywhere
13

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".


fonte
2

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.

Paul A. Clayton
fonte
0

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.

user36582
fonte