Как использовать все ядра в Windows 7?

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

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

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

5
задан vad 16 June 2010 в 17:29
поделиться

5 ответов

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

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

15
ответ дан 18 December 2019 в 05:39
поделиться

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

7
ответ дан 18 December 2019 в 05:39
поделиться

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

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

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

2
ответ дан 18 December 2019 в 05:39
поделиться

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

4
ответ дан 18 December 2019 в 05:39
поделиться

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

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

3
ответ дан 18 December 2019 в 05:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: