Определить текущую тактовую частоту процессора программно на OS X? - PullRequest
18 голосов
/ 30 марта 2012

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

Есть ли какие-либо вызовы Какао или С, чтобы найти текущую тактовую частоту, фактически не влияя на нее?

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

Спасибо!

Ответы [ 5 ]

13 голосов
/ 09 апреля 2013

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

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

12 голосов
/ 16 января 2013

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

sysctl hw.cpufrequency

Или через C:

#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;
}
6 голосов
/ 30 марта 2012

Поскольку это процессор 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 ГГц.

0 голосов
/ 01 мая 2013

Кажется, это работает правильно на 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);
0 голосов
/ 07 августа 2012

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

возможно, вы можете связаться с ним для получения кода.

...