Загрузка процессора на С++

Средства разработки, технические вопросы, отвечает (по мере сил) Отдел Разработок
Закрыто
mkol
Академик (6 lvl)
Сообщения: 1189
Зарегистрирован: Вс апр 11, 2004 12:14

Загрузка процессора на С++

Сообщение mkol » Ср дек 14, 2005 11:12

Кто-нибудь может прислать исходник или дать ссылку на пример кода?

Gngr
Студент (1 lvl)
Сообщения: 40
Зарегистрирован: Пт фев 27, 2004 00:40

Сообщение Gngr » Сб дек 17, 2005 14:46

Как правило это простые математические операции сложить вычесть умножить и разделить над какими-нить переменными внутри бесконечного цикла. Если нет мат сопроцессора, то лучше тогда числа с плавующей запятой.
Хотя надо еще точно знать под какой процессор и ОС будешь писать, так некоторые из них умеют эти операции оптимизировать или балансировать загрузку ЦП. По этому надо больше информации.

mkol
Академик (6 lvl)
Сообщения: 1189
Зарегистрирован: Вс апр 11, 2004 12:14

Сообщение mkol » Вс дек 18, 2005 12:55

А нет ли в самом процессоре XScale встроенной функции или регистра для определения степени его загрузки?

Gngr
Студент (1 lvl)
Сообщения: 40
Зарегистрирован: Пт фев 27, 2004 00:40

Сообщение Gngr » Вс дек 18, 2005 17:37

Так его надо загрузить вычислениями или диагностировать его загруженность?

mkol
Академик (6 lvl)
Сообщения: 1189
Зарегистрирован: Вс апр 11, 2004 12:14

Сообщение mkol » Пн дек 19, 2005 06:20

Требуется, чтобы фоновая программа (сама почти бездействует) могла определить текущую степень загрузки CPU.

Gngr
Студент (1 lvl)
Сообщения: 40
Зарегистрирован: Пт фев 27, 2004 00:40

Сообщение Gngr » Пн дек 19, 2005 14:02

К сожалению аналог функции NtQuerySystemInformation под WinCE мне найти не удалось - другого пути я не вижу, так так загруженность CPU - это понятие ОС, а не процессора (последний работает все время).

Боюсь такая возможность сейчас отсутствует. =(

mkol
Академик (6 lvl)
Сообщения: 1189
Зарегистрирован: Вс апр 11, 2004 12:14

Сообщение mkol » Пн дек 19, 2005 18:18

А разве в CPU нет команды останова до первого прерывания? Многозадачная ОС работает исключительно по прерываниям, если нет текущего активного процесса. К тому же, режим энергосбережения подразумевает снижение частоты и питания при неполной нагрузке, которую определяет сам CPU.

Gngr
Студент (1 lvl)
Сообщения: 40
Зарегистрирован: Пт фев 27, 2004 00:40

Сообщение Gngr » Пн дек 19, 2005 19:03

Не буду врать - не знаю, как работает XScale, но в любом случаее уверен, что даже если и найдется какой-нить механизм (на пример сравенение энорго потребления с максимальным или изменение часты), то в любом случаее тебе придется получать 0 уровень доступа.
А под виндами такое можно сделать только написав драйвера. По этому врядли ты будешь с этим заморачиваться =)

ВадимП
Нобелевский лауреат (7 lvl)
Сообщения: 6385
Зарегистрирован: Ср июн 04, 2003 15:03

Сообщение ВадимП » Пн дек 19, 2005 19:18

Загрузка процессора показывается в файле /proc/stat.
Пример рассчета загрузки процессора (отдельно считается процент простоя процессора, ожидания окончания ввода/вывода, загрузки пользовательскими программами и процент времени потребляемого собственно операционной системой):

Код: Выделить всё

    /* get the cpu time info */
    {
        fd = open("stat", O_RDONLY);
        len = read(fd, buffer, sizeof(buffer)-1);
        close(fd);
        buffer[len] = '\0';

        p = skip_token(buffer);                 /* "cpu" */
        cp_time[0] = strtoul(p, &p, 0);
        cp_time[1] = strtoul(p, &p, 0);
        cp_time[2] = strtoul(p, &p, 0);
        cp_time[3] = strtoul(p, &p, 0);

        /* convert cp_time counts to percentages */
        percentages(4, cpu_states, cp_time, cp_old, cp_diff);
    }

snn
Кандидат (3 lvl)
Сообщения: 111
Зарегистрирован: Пт апр 08, 2005 15:49

Сообщение snn » Вт дек 20, 2005 12:22

mkol писал(а):Требуется, чтобы фоновая программа (сама почти бездействует) могла определить текущую степень загрузки CPU.
GetIdleTime, но не все производители её поддерживают. Есть также OEMIdle, можно посмотреть там дальше по ссылкам.
LOOX 720

mkol
Академик (6 lvl)
Сообщения: 1189
Зарегистрирован: Вс апр 11, 2004 12:14

Сообщение mkol » Вт дек 20, 2005 22:01

Нашел пример:

dwStartTick = GetTickCount();
dwIdleSt = GetIdleTime();
Sleep();
dwStopTick = GetTickCount();
dwIdleEd = GetIdleTime();
PercentIdle = ((100*(dwIdleEd - dwIdleSt)) / (dwStopTick - dwStartTick));

Только вот GetIdleTime компилятор не переваривает.

snn
Кандидат (3 lvl)
Сообщения: 111
Зарегистрирован: Пт апр 08, 2005 15:49

Сообщение snn » Ср дек 21, 2005 01:03

Через LoadLibrary/GetProcAddress попробуйте.
LOOX 720

Gngr
Студент (1 lvl)
Сообщения: 40
Зарегистрирован: Пт фев 27, 2004 00:40

Сообщение Gngr » Ср дек 21, 2005 11:31

Да, интерестная функция - в coredll.dll она есть, а в заголовочных файлах ее нет =))

Правда я только смотрел в тех, что идут вместе с VS2005.
Может в PPS SDK она есть?
Может таким образом и другие найдуться =))

mkol
Академик (6 lvl)
Сообщения: 1189
Зарегистрирован: Вс апр 11, 2004 12:14

Сообщение mkol » Пт дек 23, 2005 18:54

Как всегда Мелкософт противоречит сам себе в пределах документации к одной версии. В итого экспериментов у меня получилось следующее:

dwIdleStart = GetIdleTime();
Sleep(100);
dwIdleEnd = GetIdleTime();
PercentIdle = 100 + dwIdleStart - dwIdleEnd;

Закрыто

Вернуться в «Программирование для КПК»