Cerium の並列処理向け I/O の設計と実装
Masataka Kohagura
21st January , 2014
Masataka Kohagura
21st January , 2014
近年のCPUのほとんどはマルチコアであり、それらの性能を引き出すためには並列プログラミングが必須となっている。そこで当研究室では Cerium Library の開発を行い、提供することによって並列プログラミングを容易にしている。
先行研究では Task の並列化によって、プログラム全体の処理速度は向上しているが、ファイル読み込み等の I/O に対して並列に Task が動作するようにはされていない。
現状では、ファイルを全て memory に mapping を行ってから Task が走るようになっているので、非常に大きいサイズのファイルを読み込むと、ファイルを memory に mapping するまでの時間がオーバーヘッドになってしまう。
本研究では I/O と Task の並列化の設計、実装によってプログラム全体の処理速度、処理効率を上げていく。
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 していく。
修正前
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) { ・・・ }
ファイルの読み込みだけを行うプログラム
firefly 上で実行
2*2.66 GHz, HHD 1TB, memory 16GB
file size : 10740996168 Byte (約10GB)
mode | time(s) |
mmap | 0.194788 |
read_divide_size | |
4*4096 Byte | 391.734989 |
4*4096*1024 Byte | 123.563726 |