openmp使用時のrealtime timerを試す。
1. gettimeofday() --- 安定してほぼ同じ値を返す。しかし"POSIX.1-2008 marks gettimeofday() as obsolete, recommending the use of clock_gettime(2) instead."(man gettimeofdayより)
thread=2
thread=3
thread=5
thread=4
thread=7
thread=6
thread=1
thread=0
2.003188
real 0m2.007s
user 0m0.044s
sys 0m0.024s
2.clock_gettime() --- こちらを推奨しているが安定しない。値が変。
$ time ./a.out
thread=2
thread=7
thread=4
thread=5
thread=0
thread=1
thread=6
thread=3
7.540382
real 0m2.009s
user 0m0.084s
sys 0m0.000s
$ time ./a.out
thread=1
thread=5
thread=4
thread=6
thread=7
thread=0
thread=2
thread=3
3.323497
real 0m2.005s
user 0m0.052s
sys 0m0.008s
ソース
#include <stdio.h>
#include <unistd.h>
#ifdef CLOCK
#include <time.h>
#else
#include <sys/time.h>
#endif
#include <omp.h>
double second_() {
struct timespec res;
#ifdef CLOCK
clock_gettime(CLOCK_MONOTONIC, &res);
return (res.tv_sec + res.tv_nsec * 1.0e-6);
#else
struct timeval tv;
struct timezone tz;
gettimeofday(&tv,&tz);
return ( tv.tv_sec + tv.tv_usec*1.0e-6);
#endif
}
int main() {
double a,b;
a=second_();
#pragma omp parallel
printf("thread=%i\n",omp_get_thread_num());
sleep(2);
#pragma omp end parallel
b=second_();
printf("%lf\n",b-a);
return 0;
}
コンパイル&リンク
$ cc (-DCLOCK) -fopenmp thisfile.c -lrt
ubuntu 11.10, core i7 (4core,8thread)
参考: