2

大学の仕事のため、単純な最適化であるインライン化を調査する必要があります。

基本的なコードは次のとおりです。

#include <stdio.h>
#include <sys/time.h>
#include <stdlib.h>

#define ITER 1000
#define N 3000000

int i, j;
float x[N], y[N], z[N];

void add(float x, float y, float *z){
    *z = x + y;
}

void initialVersion(){
    struct timeval inicio, final;
    double time;

    gettimeofday(&inicio, 0);
    for(j = 0; j < ITER; j++){
        for(i = 0; i < N; i++){
            add(x[i], y[i], &z[i]);
        }
    }

    gettimeofday(&final, 0);

    time = (final.tv_sec - inicio.tv_sec + (final.tv_usec - inicio.tv_usec)/1.e6);

    printf("Time: %f\n", time);

}

そして、インライン化されたコードは次のとおりです。

#include <stdio.h>
#include <sys/time.h>
#include <stdlib.h>

#define ITER 1000
#define N 3000000

int i, j;
float x[N], y[N], z[N];

void inliningVersion(){
    struct timeval inicio, final;
    double time;

    gettimeofday(&inicio, 0);
    for(j = 0; j < ITER; j++){
        for(i = 0; i < N; i++){
            z[i] = x[i] + y[i];
        }
    }

    gettimeofday(&final, 0);

    time = (final.tv_sec - inicio.tv_sec + (final.tv_usec - inicio.tv_usec)/1.e6);

    printf("Time: %f\n", time);

}

オプション -O0 を使用して gcc でコンパイルすると、結果は基本バージョンで 14.27 秒、インライン化されたバージョンで 4.45 秒です。それは一般的ですか?プログラムを 10 回実行しましたが、結果は常に似ています。どう思いますか?

次に、オプション -O1 を使用してコンパイルすると、結果は両方のバージョンでほぼ同じで、約 1.5 秒なので、gcc が O1 でインライン化を行っていると思います。

ちなみに、gettimeofday は、プログラム自体が使用した時間だけでなく、全体の時間をカウントすることを知っていますが、その関数を具体的に使用する必要があります。

前もって感謝します!

4

1 に答える 1