ओपी एक सीपीयू घड़ी की गति विंडोज और लिनक्स के बीच नियमित पोर्टेबल की गणना करना चाहता है।ये रहा:
#ifdef WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
typedef unsigned __int64 usCount;
static usCount GetUsCount()
{
static LARGE_INTEGER ticksPerSec;
static double scalefactor;
LARGE_INTEGER val;
if(!scalefactor)
{
if(QueryPerformanceFrequency(&ticksPerSec))
scalefactor=ticksPerSec.QuadPart/1000000000000.0;
else
scalefactor=1;
}
if(!QueryPerformanceCounter(&val))
return (usCount) GetTickCount() * 1000000000;
return (usCount) (val.QuadPart/scalefactor);
}
#else
#include <sys/time.h>
#include <time.h>
#include <sched.h>
typedef unsigned long long usCount;
static usCount GetUsCount()
{
#ifdef CLOCK_MONOTONIC
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
return ((usCount) ts.tv_sec*1000000000000LL)+ts.tv_nsec*1000LL;
#else
struct timeval tv;
gettimeofday(&tv, 0);
return ((usCount) tv.tv_sec*1000000000000LL)+tv.tv_usec*1000000LL;
#endif
}
#endif
static usCount usCountOverhead, CPUClockSpeed;
#ifdef __GNUC__
#include "x86intrin.h"
#define __rdtsc() __builtin_ia32_rdtsc()
#endif
static usCount GetClockSpeed()
{
int n;
usCount start, end, start_tsc, end_tsc;
if(!usCountOverhead)
{
usCount foo=0;
start=GetUsCount();
for(n=0; n<1000000; n++)
{
foo+=GetUsCount();
}
end=GetUsCount();
usCountOverhead=(end-start)/n;
}
start=GetUsCount();
start_tsc=__rdtsc();
for(n=0; n<1000; n++)
#ifdef WIN32
Sleep(0);
#else
sched_yield();
#endif
end_tsc=__rdtsc();
end=GetUsCount();
return (usCount)((1000000000000.0*(end_tsc-start_tsc))/(end-start-usCountOverhead));
}
जाहिर है इस 86/64 पर ही काम करता है, और यह सीपीयू के रूप में एक ही गति से गिनती टीएससी पर निर्भर करता है। यदि आपने अजीब ओवरक्लिंग चीजें की हैं जैसे उदा। मेरे पर मैं एफएसबी पर चढ़ता हूं लेकिन कोर घड़ी को स्पेक पर रखने के लिए गुणक को डाउन्रेट करता हूं, इसलिए टीएससी एफएसबी समय पर अधिकतम गुणक जितना तेज़ होगा।
GetClockSpeed () चलाने से पहले सर्वोत्तम परिणाम प्राप्त करने के लिए, मैं सुझाव दूंगा कि आप एंटी-स्पीडस्टेप लूप उदा।
usCount start;
start=GetUsCount();
while(GetUsCount()-start<3000000000000ULL);
CPUClockSpeed=GetClockSpeed();
नियाल
स्रोत
2012-03-17 20:24:36
__cpuinfo के परिणामस्वरूप स्ट्रिंग में क्लॉकस्पीड – bsruth
@bsruth धन्यवाद, अब मुझे लगता है कि यह वास्तव में ब्रांडस्ट्रिंग –