Ceriumによる
正規表現の実装

Masataka Kohagura
1st October , 2013

研究目的

本研究室では、Cell用に作られたCeriumにて並列プログラミングを行なっている。様々な例題を実装することにより、どのような問題でも並列処理ができることを証明する。

現在は文字列サーチを実装している段階で、ボイヤームーア法を実装している。 セミグループという、分割したファイルに対して並列処理をさせるような手法によって、既存の文字列サーチと処理速度を比較し、どれだけ速く、どれだけ効率よくなるのかを測定する。

並列処理は逐次処理よりも処理時間を短縮できる可能性があるが、I/O命令がボトルネックになる。 このボトルネックを軽減させるにはどのような処理をさせればよいのか考察し、処理全体の効率化の改善を図る。

mmapからfreadへの書き換え(1)

変更前

static st_mmap_t
my_mmap(char *filename)
{
    int fd = -1; 
    int map = MAP_PRIVATE;
    st_mmap_t st_mmap;
    struct stat sb; 

    if ((fd=open(filename,O_RDONLY,0666))==0) {
        fprintf(stderr,"can't open %s\n",filename);
    }   

    if (fstat(fd,&sb)) {
        fprintf(stderr,"can't fstat %s\n",filename);
    }   

    st_mmap.size = fix_byte(sb.st_size,4096);

    st_mmap.file_mmap = (char*)mmap(NULL,st_mmap.size,PROT_READ,map,fd,(off_t)0);    if (st_mmap.file_mmap == (caddr_t)-1) {
        fprintf(stderr,"Can't mmap file\n");
        perror(NULL);
        exit(0);
    }       
    return st_mmap;
}
      

mmapからfreadへの書き換え(2)

変更後

my_fread(TaskManager *manager,char *filename)
{
    FILE *fd;
    st_mmap_t st_mmap;
    struct stat sb;

    if ((fd=fopen(filename,"r"))==NULL) {
        fprintf(stderr,"can't open %s\n",filename);
    }

    if (fstat(fileno(fd),&sb)) {
        fprintf(stderr,"can't fstat %s\n",filename);
    }

    st_mmap.size = fix_byte(sb.st_size,4096);

    st_mmap.file_mmap = (char*)manager->allocate(st_mmap.size);
    fread(st_mmap.file_mmap,st_mmap.size,1,fd);
    if (st_mmap.file_mmap == (caddr_t)-1) {
        fprintf(stderr,"Can't mmap file\n");
        perror(NULL);
        exit(0);
    }
    return st_mmap;
}