Как использовать все ядра в Windows 7? - PullRequest
5 голосов
/ 16 июня 2010

Я не уверен, принадлежит ли это Stackoverflow или Superuser, но я решил спросить здесь.

У меня есть консольное приложение, написанное на C, которое в настоящее время занимает около часа для завершения в 64-разрядной ОС Windows 7. Диспетчер задач сообщает, что приложение использует только 25% доступного процессора. Я хотел бы сократить время выполнения за счет увеличения использования процессора.

Есть ли способ разрешить приложению использовать все четыре ядра (у ноутбука Core i5) вместо одного? Я предполагаю, что диспетчер задач сообщает о 25%, потому что программе выделено только одно ядро.

Ответы [ 5 ]

15 голосов
/ 16 июня 2010

Без переписывания приложения, чтобы оно было многопоточным, нет, вы не можете изменить поведение приложения.Единственное, что вы можете сделать, - если приложение может обрабатывать диапазоны входных данных, то вы можете запустить 4 экземпляра приложения с различными диапазонами входных данных для обработки и объединить результаты после того, как все они будут выполнены.

Представьте, что вы визуализируете 3D-анимацию, и рендерер однопоточный, но вы можете указать начальный и конечный кадры.У вас есть 100 кадров для рендеринга, вы должны начать 4 экземпляра и указать начальный и конечный диапазоны кадров 0 - 25, 26 - 50, 51 - 75, 76 - 100. Затем вы объедините все выходные данные в ваш конечный файл фильма.*

7 голосов
/ 16 июня 2010

Приложения должны быть написаны многопоточным образом, чтобы использовать несколько ядер. Невозможно заставить однопоточное приложение использовать несколько ядер.

4 голосов
/ 16 июня 2010

Вы можете посмотреть на использование потоков OpenMP или POSIX, я бы порекомендовал OpenMP, потому что он имеет довольно простую структуру, которая в зависимости от вашей программы может сделать реализацию быстрой и легкой.

3 голосов
/ 16 июня 2010

На данный момент нет стандартных инструментов для преобразования произвольной C-программы в многопоточную программу. Поэтому, если вы, как разработчик, не пишете явно многопоточный код, не ожидайте, что ваша программа будет использовать более одного ядра одновременно, если вы не вызовете стороннюю библиотечную функцию, написанную с использованием многопоточности.

Максимум, что вы можете сделать (если это уместно в вашем случае), чтобы лучше использовать ваш ЦП, - это разделить входные данные на N блоков и запустить программу несколько раз для каждого блока, а затем сделать что-то, чтобы объединить входы, как только они все сделанный.

2 голосов
/ 16 июня 2010

Говоря педантично, ваше приложение уже использует все ядра.Как вы сказали выше, для процесса не выделено ни одного конкретного ядра (если вы не приложите явных усилий для привязки вашего процесса к одному конкретному ядру).

Процесс использует все ядра, но использует их последовательно : он работает немного на одном ядре, затем немного больше на другом ядре и так далее.Т.е. в среднем процессорное время, которое потребляет ваше приложение, распределяется равномерно по всем ядрам системы.Поскольку в любой момент времени используется только одно ядро, загрузка ЦП никогда не превысит 25% -ный предел (ваша система, очевидно, имеет 4 ядра).

Если вы хотите преодолеть 25% -й предел,Вы должны иметь возможность использовать два или более ядра одновременно , а это означает, что по крайней мере часть кода должна работать параллельно .Для этого приложение должно быть написано специально для параллельной работы.Обычное однопоточное приложение никогда не сделает это само по себе.

...