2013年12月10日火曜日

開発環境

C実践プログラミング 第3版 (Steve Oualline (著)、 望月 康司 (監訳) (翻訳)、谷口 功 (翻訳)、オライリー・ジャパン)のⅡ部(単純なプログラミング)の15章(デバッグと最適化)、15.8(プログラミング実習)、実習 15-2を解いてみる。

その他参考書籍

実習15-2.

コード

sample.c

#include <stdio.h>
#include <memory.h>
#include <time.h>

#define X_SIZE 60
#define Y_SIZE 64
#define Z_SIZE 1024

int matrix1[X_SIZE][Y_SIZE];
int matrix2[Y_SIZE][Z_SIZE];
int matrix[X_SIZE][Z_SIZE];

clock_t t1;

int main()
{
    int i, j;
    int t;
    memset(matrix1, -1, sizeof(matrix1));
    memset(matrix2, 0, sizeof(matrix2));
    void multiple_matrix(void);
    void multiple_martrix_1(void);
    t1 = clock();
    multiple_matrix();
    t = clock() - t1;
    printf("index : %10d ms\n", t);
    memset(matrix1, -1, sizeof(matrix1));
    memset(matrix2, 0, sizeof(matrix2));
    t1 = clock();
    multiple_martrix_1();
    t = clock() - t1;
    printf("pointer: %10d ms\n", t);
    return (0);
}

void multiple_matrix(void)
{
    int i, j;
    int  total;
    int x, y;
    for(i = 0; i < X_SIZE; i++){
        for(j = 0; j < Z_SIZE; j++){
            total = 0;
            for(y = 0; y < Y_SIZE; y++){
                for(x = 0; x < Y_SIZE; x++){
                    total += matrix1[i][y] * matrix2[x][j];
                }
            }
            matrix[i][j] = total;
        }
    }
}

void multiple_martrix_1(void){
    register int i, j;
    register int *matrix1_ptr;
    register int *matrix2_ptr;
    register int *matrix_ptr;
    register int *temp_ptr;
    register int total;
    register int x, y;
    
    matrix1_ptr = &matrix1[0][0];
    temp_ptr = &matrix2[0][0];
    for(matrix_ptr = &matrix[0][0];
            matrix_ptr <= &matrix[X_SIZE - 1][Z_SIZE - 1]; ++matrix_ptr){
        total = 0;
        temp_ptr += Z_SIZE;
        for(matrix2_ptr = temp_ptr;
                matrix2_ptr < &matrix2[Y_SIZE - 1][Z_SIZE - 1];
                matrix2_ptr += Z_SIZE){
            total += (*matrix1_ptr) * (*matrix2_ptr);
            matrix1_ptr++;
        }
        *matrix_ptr = total;
    }
}

makefile

CC=cc
CFLAGS=-g

sample: sample.c
 $(CC) $(CFLAGS) -o sample sample.c

clean:
 rm -f sample

入出力結果(Terminal)

$ make
cc -g -o sample sample.c
$ ./sample
index :    1518223 ms
pointer:        305 ms
$

0 コメント:

コメントを投稿