Pergunta

Eu escrevi um programa para resolver um problema complicado. Este programa é apenas um aplicativo de console AC# e não faz console.Write até que a parte da computação seja concluída, para que a saída não afete o desempenho. O programa é assim:

static void Main(string[] args)
        {

            Thread WorkerThread = new Thread(new ThreadStart(Run), StackSize);
            WorkerThread.Priority = ThreadPriority.Highest;
            WorkerThread.Start();
            Console.WriteLine("Worker thread is runing...");
            WorkerThread.Join();
        }

Agora, leva 3 minutos para ser executado, quando eu abro meu gerente de tarefas, vejo apenas 12% do tempo da CPU. Na verdade, eu tenho uma CPU Intel I7 com a memória DDR3 de três canais de três canais. Estou me perguntando como posso melhorar a utilização do meu hardware.

Muito obrigado

Foi útil?

Solução

1 Thread pode ocupar apenas 1 núcleo, então você precisa separar a tarefa em vários threads para utilizar sua CPU. Seu absolutamente tem certeza de que você não está fazendo operações de IO em seu algoritmo?

Outras dicas

Seu i7 suporta hiper rosqueamento, para que um quádrupo i7 possa lidar com oito threads simultaneamente.

Seu programa parece usar um thread, para que o Windows Task Manager mostre um uso da CPU de 12 a 13 % simplesmente porque você utiliza uma das oito CPUs "virtuais" disponíveis.

Como o Heavywave disse, você precisa encontrar uma maneira de dividir seu cálculo em mais threads que você pode executar em paralelo para obter um uso mais alto da CPU.

Um Intel i7 deve relatar como 8 núcleos (4 núcleos físicos, cada um relatando como 2 núcleos, devido ao hiper-threading).

Ao iniciar um único thread, você deve obter 12,5% da CPU, em geral. Que está quase perfeitamente alinhado com o que você descreve.

Um thread não pode e não será exibido em vários núcleos que consomem todos os recursos. Se você deseja usar mais recursos, precisa iniciar vários threads. Idealmente, você precisará de um mínimo de 4 threads e, mais provavelmente, de 6 a 8 threads para se aproximar de 100% de utilização.

Para fazer isso, você precisa encontrar uma maneira de interromper seu "problema complicado" em caminhos de instruções paralelizáveis.

Descubra o que está gastando, está fazendo tempo, em termos de porcentagem. Este é o método que eu uso, independentemente da plataforma. Eu tive programas em que tinha certeza de que não estava fazendo E/S e adivinhe? Eu era, pelas razões mais obscuras.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top