Pode ser feito um programa single-threaded para usar múltiplos 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 múltiplos núcleos de CPU?

    
por Chris 07.06.2011 / 01:41

4 respostas

16

Infelizmente, um programa legado escrito 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 de CPU requer vários encadeamentos, que precisam se comunicar uns com os outros, garantindo que as condições de corrida e outros problemas não ocorram. Um aplicativo antigo não pode ser usado 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 paralelizado.

    
por 07.06.2011 / 02:08
13

Qual é o seu objetivo com isso? Maior desempenho? Infelizmente, os aplicativos projetados para usar apenas um núcleo não farão uso de mais. Isso é o que esta conversa de aplicativos "multi-threaded" são tudo.

    
por 07.06.2011 / 01:47
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 direta dessas técnicas é usar bibliotecas e código de sistema que usa múltiplos 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 paralelizado e pode ser possível fazer em paralelo com a execução do aplicativo. Mesmo sem o gerenciamento automático de memória, há algum potencial para o 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 da memória como disponível.

Uma segunda técnica é a tradução binária. Embora isso possa ser considerado "reescrevendo o aplicativo", isso é feito por software e sem acesso ao código-fonte. Produzir paralelismo em nível de thread parece não ter sido o principal objetivo da maioria das pesquisas e desenvolvimento usando tradução binária (que geralmente diz respeito à execução de código legado em um ISA diferente, explorando extensões ISA ou otimizando uma microarquitetura em particular e usando informações dinâmicas para fornecer maior otimização guiado por perfil de qualidade), mas o potencial é óbvio.

Uma terceira técnica é o multithreading especulativo. Atualmente, nenhum processador (que conheço) 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 envolveria 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 de comunicação entre os encadeamentos e os segmentos de desova), pelo paralelismo limitado que eles podem explorar e pelo retorno limitado sobre o investimento (aplicações importantes que podem ser beneficamente paralelizados e provavelmente serão reescritos, muitas aplicações beneficiariam relativamente pouco de tais técnicas (especialmente com limites de energia / térmicas permitindo que um único núcleo funcione em uma freqüência mais alta do que múltiplos núcleos), e os custos de desenvolvimento são significativos ). No entanto, essas técnicas do existem e é teoricamente possível usar vários núcleos com um aplicativo projetado para usar um único núcleo.

    
por 17.02.2015 / 23:32
0

Não, não pode ser. Um programa é explicitamente escrito para usar vários núcleos. Não é trivial fazer o trabalho em vários núcleos. Requer sincronizações de todos os segmentos. Como se alguém jogasse a bola, a outra pegasse, uma polisse a bola, uma limpasse, uma checasse a bola se tinha boa quantidade de ar nela. Agora imagine cada caractere como sendo executado em um encadeamento 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. Assim, os programadores precisam redesenhar com cuidado um único aplicativo principal para que ele possa aproveitar vários núcleos.

    
por 30.10.2018 / 15:32