CeriumにおけるGPGPUの最適化

Yuhi TOMARI

研究目的

当研究室ではCellおよびLinux、 Mac OSX上で動く並列プログラミングフレームワーク、 Ceriumの開発・改良を行っている。

本研究では新たにGPU上での並列実行に対応し、 ヘテロジニアス(異種混合)環境下でのプログラミングをサポートする

GPGPUでは通常のマルチコアCPUとは異なる並列プログラミング特別なチューニングが必要となる。 そこでCeriumを用いてその差を吸収し、自動的なチューニングを可能にする。

しかし、GPUのみで並列計算を行った場合、Taskによっては並列度が出ない場合がある。 そこでチューニングの一環として、MultiCoreとGPU上での同時実行を可能にする。

進捗

Scalaで遊んでた
mallocのお勉強
kernel reading party(小崎さん)
動画
資料

mallocってなんだっけ……?

          void *malloc(size_t size);
          char *str = (char*)malloc(length); // 使う型でキャストする

古典的malloc(K&R malloc)


          union header {
              struct {
                  union header *ptr;  // 空きリストの上なら次のブロック
                  unsigned size;      // このブロックの大きさ
              } s;
          };

First Fit

リストを頭から見ていって、最初に見つけたものを使用するというすごいシンプルな方法。

First Fit

実は、もう一個先にもっと適切なブロックがあった。こんな場合に対応できない…というか、対応しないのがfirst fit。

あまりよくない……

free

          void free(void *ptr);

メモリの開放自体は、使用中のブロックをfree listに追加するだけで良い。 引数で受け取ったポインタ部分を開放したら良い……かに思える。 でもそれだけじゃダメで、開放したい領域と隣接しているブロックが空きブロックなら併合しないといけない。

free

listから最初のポインタと、その次のポインタを取得。prev < p < nextを満たすまで走査していく

free

あった!!

開放後に前後のメモリと併合する必要がある場合があるので、prevとp・pとnextが隣接してるか判定する。

free

チェックに引っかかったところをマージする。

古典的malloc & freeまとめ

フラグメンテーションが頻発する。

mallocの改良

そもそも、一つのfree listで管理することが無理がある

サイズ16Byte用のリスト、サイズ24Byte用のリスト……というようにリストを複数作ってやる

  • mallocで要求されたsizeを8で割れば自分が使用するindexとなる
  • 無限にリストを増やすわけにはいかないので、このリストを使うのは512バイト以下の場合のみ
  • 512バイト以上の大きいデータの場合は、特殊な管理を行う
  • 大きいデータと小さいデータを一緒に管理するからフラグメンテーションが進むんだ
    →大きいデータ用の領域がもう一個欲しい
    →そうだ、mmapを使おう

mmapってなんだっけ……?

          void *alloc_mmap(size_t size) {
              int fd    = open("/dev/zero", O_RDONLY);
              void *ret = mmap(addr, length, prot, flags, fd, offset); 
              return ret;
          }
addrmapするメモリアドレス。NULLを渡せばkernelがアドレスを選択する。
lengthaddrから何バイトマッピングするか。
protマッピングのメモリ保護の指定。Read Write Exec None等がある。
flagsマップを要求された時、共有するかコピーを渡すか。
offsetファイルの何バイト目からをメモリにマップするか。

Huge Block

mmapで確保するので、free listからは独立している。

listを使って管理しているわけではないので、listをたどったりしなくて良い。

ほしかったらmmapして、いらなくなったらmunmapすればよい。