Como você limita um programa de processo único executado em um ambiente Windows para executar apenas em uma única CPU em uma máquina com vários núcleos?
É o mesmo entre um programa em janela e um programa de linha de comando?
ATUALIZAR:
- Motivo para fazer isso: comparando vários aspectos das linguagens de programação
- Eu preciso de algo que funcione desde o início do processo, portanto, a resposta da @ akseli, apesar de ótima para outros casos, não resolve o meu caso
windows
process
multi-core
Jonathan
fonte
fonte
Respostas:
Se você estiver executando o Windows Vista / 7 (possivelmente XP, mas não tenho certeza), é realmente bastante simples.
Digite:
Control+Shift+Esc
para obter seu gerenciador de tarefas.Clique na guia Processos
Encontre o processo que precisa de sua afinidade de processador alterada
Clique com o botão direito do mouse no processo
Clique em "Definir afinidade"
Aqui você pode selecionar quais processadores o seu processo usará.
Boa sorte!
EDIT: Você precisa ser administrador para que isso funcione.
fonte
na linha de comando, use
isso executará o programa.exe na primeira CPU, pois "1" é o valor hexadecimal da máscara de afinidade
fonte
Depende do que você está disposto a fazer:
Método 1: Sob demanda
Use ImageCFG . Este utilitário permitirá que você configure um executável para executar em qualquer número de núcleos. Certifique-se de fazer backup do executável de destino antes de fazer as alterações e restaurá-lo quando terminar de brincar com ele.
Método 2: forçar uma sessão inteira do Windows (Vista / 7)
bcdedit /set onecpu on
em um prompt de comandobcdedit /set onecpu off
e reinicie novamente.Método 2: forçar uma sessão inteira do Windows (XP)
Você encontrará a seguinte seção (ou similar) no arquivo:
[sistemas operacionais]
partição multi (0) disco (0) rdisk (0) (2) \ WINDOWS = "Microsoft Windows XP Professional" / fastdetect
Altere-o adicionando o sinalizador / onecpu:
[sistemas operacionais]
partição multi (0) disco (0) rdisk (0) (2) \ WINDOWS = "Microsoft Windows XP Professional" / fastdetect / onecpu
Reinicie. Quando terminar de jogar, remova a bandeira e reinicie novamente.
Método 0: Não é um bom método (afinidade do processador)
Receio que qualquer coisa que envolva afinidade do processador não seja uma boa opção. A afinidade do processador é uma pista para o processador. O processador não é obrigado a respeitá-lo, e muitas vezes não o fará.
fonte
D:\>bcdedit /set onecpu
resulta emThe set command specified is not valid.
....The parameter is incorrect.
Eu coloquei a seguinte função no meu programa em python 2.6 e ele chama funções do Windows. Minha máquina possui apenas dois núcleos, portanto, pode ser necessário alterar essa parte. Os comentários mostram como ver qual é a afinidade atual. Funciona "como está" para uma máquina de núcleo único se você definir ou usar como padrão uma máscara de 1.
fonte
No Windows 8, você precisa ir para a guia Detalhes do gerenciador de tarefas para definir a afinidade. Não oferece a opção na guia Processos.
EDIT: Além disso, se o programa que você deseja iniciar tiver parâmetros, esse encadeamento pode ser útil: Como iniciar um programa com argumentos de linha de comando no cmd do Windows com o comando 'start'?
fonte
Enquanto procurava informações muito semelhantes usando o PowerShell, encontrei as informações necessárias aqui: http://www.energizedtech.com/2010/07/powershell-setting-processor-a.html
Você não mencionou qual sistema operacional Windows estava usando (os mais antigos não vieram com o PowerShell, embora você possa instalá-lo se ele não estiver lá).
A rápida é que, no PowerShell, a afinidade do processo é simplesmente uma propriedade que você pode alterar facilmente.
Para ver as propriedades (e outras informações) do seu processo (usando foo como um processo de exemplo), o comando do PowerShell seria:
Você verá que ProcessorAffinity é uma dessas propriedades. Mudá-lo é trivial e você pode selecionar em qual núcleo deseja executar, usando os valores da tabela / link do Revolter acima.
Para ver qual é o valor da propriedade ProcessorAffinity para foo, aqui está o comando:
Portanto, se você quiser executar foo apenas na CPU 4, defina o valor da seguinte forma:
fonte
start /affinity
resposta. Sua técnica pode fazer isso? Se sim, por favor, explique como.Start-Process foo ; (Get-Process foo).ProcessorAffinity=8
No entanto, depois de ler o seu comentário, e descobrir queStart-Process
tem em si uma bandeira afinidade faltando, eu vim com o seguinte, que eu testei:[System.Diagnostics.Process]::start("foo.exe").ProcessorAffinity=0x0010