Cerium の並列処理向け I/O の設計と実装

Masataka Kohagura
21st January , 2014

研究背景と目的

近年のCPUのほとんどはマルチコアであり、それらの性能を引き出すためには並列プログラミングが必須となっている。そこで当研究室では Cerium Library の開発を行い、提供することによって並列プログラミングを容易にしている。

先行研究では Task の並列化によって、プログラム全体の処理速度は向上しているが、ファイル読み込み等の I/O に対して並列に Task が動作するようにはされていない。

現状では、ファイルを全て memory に mapping を行ってから Task が走るようになっているので、非常に大きいサイズのファイルを読み込むと、ファイルを memory に mapping するまでの時間がオーバーヘッドになってしまう。

本研究では I/O と Task の並列化の設計、実装によってプログラム全体の処理速度、処理効率を上げていく。

したこと

2GB 以上のファイルが読み込めなかった -> 修正

manager->allocate(int) を使用したところ

if (divide_read_flag != 0) {
    printf("[divide read mode]\n");
    w->file_mmap = (char*)manager->allocate((long)w->read_filesize);
    r_run = manager->create_task
            (RUN_READ_BLOCKS, (memaddr)&w->self, sizeof(memaddr),0,0);
}else {
    printf("[mmap mode]\n");
    r_run = manager->create_task
            (MMAP , (memaddr)&w->self, sizeof(memaddr),0,0);
}

divide read をする前に manager->alocate にて memory を確保する。 この領域に、分割して読み込んだ file を mapping していく。

kernel/ppe/TaskManagerImpl.h

修正前

void* allocate(int size, int alignment)
{
#if defined(__SPU__) || ! defined(HAS_POSIX_MEMALIGN)
    buff =  malloc(size);
#else
    posix_memalign(&buff, alignment, size);
#endif
    return buff;
}

修正後

void* allocate(long size, int alignment)
{
    ・・・
}

fileread

ファイルの読み込みだけを行うプログラム

firefly 上で実行
2*2.66 GHz, HHD 1TB, memory 16GB
file size : 10740996168 Byte (約10GB)

modetime(s)
mmap0.194788
read_divide_size
4*4096 Byte391.734989
4*4096*1024 Byte123.563726