Программно определить текущую тактовую частоту процессора в OS X?

Я только что купил отличный MBA 13-дюймовый Core i7. Мне сказали, что скорость процессора меняется автоматически, и тоже довольно сильно. Мне бы очень хотелось иметь возможность отслеживать это с помощью простого приложения.

Существуют ли какие-либо вызовы Cocoa или C для определения текущей тактовой частоты, фактически не влияющие на нее?

Изменить: я согласен с ответами, используя терминальные вызовы, а также программные.

Спасибо!


person Tim    schedule 30.03.2012    source источник
comment
Не будучи особенно знакомым с osx, но не будет ли файловая система типа /proc с этой информацией? например в Linux это /proc/cpuinfo   -  person Marc B    schedule 30.03.2012
comment
Насколько я могу судить, /proc/ нет. Есть команда system_profiler, которая дает скорость процессора, указанную на коробке, но она не меняется с тактовой частотой обновления в реальном времени.   -  person Tim    schedule 30.03.2012
comment
См. этот вопрос, почему это чрезвычайно трудно сделать.   -  person Mysticial    schedule 30.03.2012
comment
Читаю сейчас. Если это вообще поможет, мне плевать на мошенников, так как я не буду пытаться обманывать себя. Это скорее инструмент любопытства.   -  person Tim    schedule 30.03.2012
comment
Мистик, я собираюсь назначить награду за этот вопрос. Опять же, мне не нужна защита от читерства — я просто хочу посмотреть, как заработает TurboBoost (может быть, написать приложение для игры это видео каждый раз)   -  person Tim    schedule 02.04.2012


Ответы (5)


Попробуйте этот инструмент под названием «Intel Power Gadget». Он отображает частоту IA и мощность IA в режиме реального времени.

http://software.intel.com/sites/default/files/article/184535/intel-power-gadget-2.zip

person Yevgeni    schedule 09.04.2013
comment
Это действительно именно то, что я хотел. Он даже включает образец объектива-c... Отлично! - person Tim; 10.04.2013

Вы можете легко запросить скорость процессора через sysctl либо в командной строке:

sysctl hw.cpufrequency

Или через С:

#include <stdio.h>
#include <sys/types.h>
#include <sys/sysctl.h>

int main() {
        int mib[2];
        unsigned int freq;
        size_t len;

        mib[0] = CTL_HW;
        mib[1] = HW_CPU_FREQ;
        len = sizeof(freq);
        sysctl(mib, 2, &freq, &len, NULL, 0);

        printf("%u\n", freq);

        return 0;
}
person DarkDust    schedule 16.01.2013
comment
К сожалению, похоже, что это возвращает объявленную коробкой скорость (теперь 2,3 ГГц на моем MBPR), но не скорректированную скорость SpeedStep. - person Tim; 17.01.2013
comment
Тем не менее, это полезный и простой обзор использования sysctl, так что спасибо вам за это! - person Tim; 17.01.2013
comment
Выдает не текущую, а рекламируемую скорость. hw.cpufrequency, hw.cpufrequency_min, hw.cpufrequency_max дают одно и то же. - person mist; 18.04.2014
comment
Этот код переполнит Hz на новом поколении процессоров › 4Ghz. Вместо этого нужно использовать это. sysctlbyname(hw.cpufrequency_max, &speed, &len, NULL, 0); для поддержки 64-битного значения частоты. - person Ken Aspeslagh; 10.03.2015
comment
хм sysctl hw.cpufrequency всегда сообщает мне 2500000000. Intel Power Gadget сообщает о различных значениях IA от 1,3 ГГц до 3,4 ГГц, интересно, есть ли способ получить более актуальные значения... - person rogerdpack; 20.12.2016

Поскольку это процессор Intel, вы всегда можете использовать RDTSC. Это ассемблерная инструкция, которая возвращает текущий счетчик циклов — 64-битный счетчик, который увеличивается каждый цикл. Это было бы немного приблизительно, но, например.

#include <stdio.h>
#include <stdint.h>
#include <unistd.h>

uint64_t rdtsc(void)
{
    uint32_t ret0[2];
    __asm__ __volatile__("rdtsc" : "=a"(ret0[0]), "=d"(ret0[1]));
    return ((uint64_t)ret0[1] << 32) | ret0[0];
}

int main(int argc, const char * argv[])
{
    uint64_t startCount = rdtsc();
    sleep(1);
    uint64_t endCount = rdtsc();

    printf("Clocks per second: %llu", endCount - startCount);

    return 0;
}

Выведите «Часов в секунду: 2002120630» на моем MacBook Pro 2 ГГц.

person Tommy    schedule 30.03.2012
comment
На моем MBA он показывает 1,8 ГГц, что совершенно верно, но есть ли способ заставить i7 включить турбонаддув? - person Tim; 30.03.2012
comment
rdtsc не является надежным способом измерения тактовой частоты процессора. Он не настраивается на турбо-ускорение/троттлинг процессора (среди прочего). - person Mysticial; 30.03.2012
comment
@Mysticial наоборот; обычно рекомендуется как ненадежный способ измерения тактовой частоты процессора именно потому, на нее влияет турбонаддув и дросселирование процессора. - person Tommy; 31.03.2012
comment
@Tommy Мои тесты говорят о другом. На моем Xeon со штатной частотой 3,2 ГГц rdtsc всегда говорит 3,2 ГГц, независимо от того, на что я установил множитель (2,4, 2,6, 2,8, 3,0, 3,2 ГГц... все сообщаются как 3,2 ГГц rdtsc) rdtsc, похоже, меняется только тогда, когда вы начните возиться со скоростью автобуса. - person Mysticial; 31.03.2012
comment
Есть ли способ определить, что такое множитель? Мне интересно знать, до какой скорости процессор снижает нагрузку на процессор в режиме ожидания, и до какой степени TurboBoost загружает процессор. - person Tim; 31.03.2012
comment
@ Тим, я думаю, вам нужно получить доступ к BIOS, чтобы получить информацию о скорости шины / множителе. Нет простого способа сделать это, поскольку существуют сотни различных систем материнских плат/BIOS/CPU... - person Mysticial; 31.03.2012
comment
@Mystical Я видел несколько приложений, которые утверждают, что находят информацию о текущей скорости ядра, включая собственное приложение Intel (в Windows), но нигде нет исходного кода. Я уверен, что есть способ сделать это — у Intel есть большой старый pdf-файл с примером кода, но я не могу его скомпилировать, хотя я продолжу попытки. - person Tim; 31.03.2012

Существует расширение ядра, написанное "flAked", которое регистрирует p-состояние процессора в журнале ядра. http://www.insanelymac.com/forum/index.php?showtopic=258612

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

person nurbs999    schedule 07.08.2012

Кажется, это работает правильно на OSX. Однако это не работает в Linux, где sysctl устарел, а KERN_CLOCKRATE не определено.

#include <sys/sysctl.h>
#include <sys/time.h>

  int mib[2];
  size_t len;
  mib[0] = CTL_KERN;
  mib[1] = KERN_CLOCKRATE;
  struct clockinfo clockinfo;
  len = sizeof(clockinfo);
  int result = sysctl(mib, 2, &clockinfo, &len, NULL, 0);
  assert(result != -1);
  log_trace("clockinfo.hz: %d\n", clockinfo.hz);
  log_trace("clockinfo.tick: %d\n", clockinfo.tick);
person tbh    schedule 01.05.2013
comment
Запуск sysctl kern.clockrate в командной строке дает мне постоянное kern.clockrate: { hz = 100, tick = 10000, tickadj = 2, profhz = 100, stathz = 100 }, где профилировщик процессора Intel показывает разные значения, поэтому я не думаю, что это работает с настройками speedstep. - person Tim; 01.05.2013