Обнаружение текущей тактовой частоты процессора программно на OS X?
Я только что купил отличный MBA 13 " Core i7. Мне сказали, что скорость процессора меняется автоматически и довольно дико. Я бы очень хотел иметь возможность контролировать это с помощью простого приложения.
есть ли какие-либо вызовы Cocoa или C, чтобы найти текущую тактовую частоту, фактически не влияя на нее?
Edit: я в порядке с ответами, используя вызовы терминалов, а также программные.
спасибо!
5 ответов
попробуйте этот инструмент под названием "Intel Power Gadget". Он отображает частоту IA и мощность IA в режиме реального времени.
http://software.intel.com/sites/default/files/article/184535/intel-power-gadget-2.zip
вы можете запросить скорость процессора легко через 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;
}
поскольку это процессор 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 ГГц.
существует расширение ядра, написанное "flAked", которое регистрирует P-состояние процессора в журнале ядра. http://www.insanelymac.com/forum/index.php?showtopic=258612
может быть, вы могли бы связаться с ним для кода.
это, кажется, работает правильно на 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);