3 つの異なる周波数を使用して、3 台の異なるコンピューターでコードをプロファイリングしています。GFLOPs/s を測定するには周波数が必要です。これを行うコードがいくつかありますが、Turboboost を考慮していません。たとえば、私の 2600k CPU では 3.4 GHz と報告されますが、CPUz を実行すると、すべてのコアを使用するコードで CPU が 4.3 GHz (オーバークロック) で実行されていることがわかります。
#include "stdint.h"
#include "stdio.h"
#include "omp.h"
int main() {
int64_t cycles = rdtsc(); double dtime = omp_get_wtime();
//run some code which uses all cores for a while (few ms)
dtime = omp_get_wtime() - dtime;
cycles = rdtsc() - cycles;
double freq = (double)cycles/dtime*1E-9;
printf("freq %.2f GHz\n", freq);
}
__int64 rdtsc() {
#ifdef _WIN32
return __rdtsc();
#else
uint64_t t;
asm volatile ("rdtsc" : "=A"(t));
return t;
#endif
}
この質問はさまざまな回答で何度も尋ねられていることは知っていますが、これが可能かどうかはまだわかりません。タイマーを変更しようとするハッカーは気にしません。このコードは自分専用です。コードで実際の周波数を取得することは可能ですか? これは Linux でどのように行われますか? Linuxで見つけたすべての例は、基本周波数(またはおそらく最大)を示していますが、CPUzのように負荷がかかった状態での動作周波数は示していません。
編集:実際の動作周波数を示しているように見える Linux 用のプログラム、Powertop を見つけました。ソースコードが利用可能であるため、自分のコードで実際の周波数を取得する方法を理解できるかもしれません。