view paper/evaluation.tex @ 19:68ea0500773f

update
author mir3636
date Wed, 30 Jan 2019 19:36:41 +0900
parents 9100f20b8797
children 3179b8daa958
line wrap: on
line source

% GPU が遅いのは cpu, GPU 間のデータの通信の分
% Meta Data で データが GPU にあるのか, CPU にあるのかをわかるようにする
% CPU で必要なったときに初めて取り出す

\chapter{Gears OS の評価}

\section{実験環境}
今回 Twice、 BitonicSort をそれぞれ CPU、GPU環境で Gears OS の測定を行う。

使用する実験環境を\tabref{powerEdge}、 GPU 環境を\tabref{gtx1070} に示す。
また、今回は LLVM/Clang で実装した CbC コンパイラを用いて Gears OS をコンパイルする。

\begin{table}[htbp]
    \begin{center}
        \begin{tabular}{|l|l|} \hline
            Model & Dell PowerEdgeR630 \\ \hline
            OS    & CentOS 7.4.1708 \\ \hline
            Memory & 768GB \\ \hline
            CPU & 2 x 18-Core Intel Xeon 2.30GHz \\ \hline
        \end{tabular}
         \caption{実行環境}
         \label{tab:powerEdge}
    \end{center}
\end{table}

\begin{table}[htbp]
    \begin{center}
        \begin{tabular}{|l||l|} \hline
            GPU & GeForce GTX 1070 \\ \hline
            Cores & 1920 \\ \hline
            Clock Speed & 1683MHz \\ \hline
            Memory Size & 8GB GDDR5 \\ \hline
            Memory Bandwidth & 256GB/s \\ \hline
        \end{tabular}
        \caption{GPU 環境}
        \label{tab:gtx1070}
    \end{center}
\end{table}

\section{Twice}
Twice は与えられた整数配列のすべての要素を2倍にする例題である。

Twice の Task は Gears OS のデータ並列で実行される。
CPU の場合は配列ある程度の範囲に分割してTaskを生成する。
これは要素毎に Task を生成するとその分の Context を生成するために時間を取ってしまうからである。

Twice は並列実行の依存関係もなく、データ並列での実行に適した課題である。
そのため、 通信時間を考慮しなければ CPU よりコア数が多い GPU が有利となる。

要素数$2^{27}$ のデータに対する Twice の実行結果を \tabref{twice}、\figref{twice}に示す。
CPU 実行の際は $2^{27}$ のデータを 64個のTask に分割して並列実行を行っている。
GPU では1次元の block 数を $2^{15}$、 block 内の thread 数を $2^{10}$ で kernel の実行を行った。
ここでの ``GPU`` は CPU、GPU 間のデータの通信時間も含めた時間、 ``GPU(kernel only)`` は kernel のみの実行時間である。

\begin{table}[htbp]
    \begin{center}
        \begin{tabular}{|l||l|} \hline
            Processor & Time(ms) \\ \hline
            1 CPU   & 1181.215 \\ \hline
            2 CPUs  & 627.914 \\ \hline
            4 CPUs  & 324.059 \\ \hline
            8 CPUs  & 159.932 \\ \hline
            16 CPUs & 85.518\\ \hline
            32 CPUs & 43.496 \\ \hline
            GPU & 127.018\\ \hline
            GPU(kernel only)& 6.018 \\ \hline
        \end{tabular}
        \caption{$2^{27}$ のデータに対する Twice}
        \label{tab:twice}
    \end{center}
\end{table}

\newpage

\begin{figure}[htbp]
    \begin{center}
        \includegraphics[scale=0.6]{./fig/twice.pdf}
    \end{center}
    \caption{$2^{27}$ のデータに対する Twice}
    \label{fig:twice}
\end{figure}

ある程度の台数効果があると考えられる。

GPU での実行は kernel のみの実行時間は 32 CPU に比べて 約 7.2 倍の速度向上が見られた。
しかし、通信時間を含めると 16 CPU より遅い結果となってしまった。
CPU、GPU の通信時間かオーバーヘッドになっている事がわかる。

\section{Go 言語との比較}
Go 言語 は Google社が開発しているプログラミング言語である。
Go 言語によるTwice の実装例を\coderef{go}に示す。

\lstinputlisting[caption=Go 言語での Twice, label=code:go]{./src/go.go}

Go 言語は並列実行を ``go function(argv)'' のような構文で行う。
この並列実行を goroutine と呼ぶ。

Go 言語は goroutin 間のデータ送受信をチャネルというデータ構造で行う。
チャネルによるデータの送受信は ``\textless-'' を使って行われる。
例えばチャネルのデータ構造であるchannel に対して ``channel \textless- data'' とすると、 data を channel に送信を行う。
``\textless- channel'' とすると、 channel から送信されたデータを1つ取り出す。
channel にデータが送信されていない場合はchannel にデータが送信されるまで実行をブロックする。
Go 言語はチャネルにより、データの送受信が簡潔に書ける。
しかし、チャネルは複数の goroutine で参照できるためデータの送信元が推測しづらい。

Gears OS では goroutine は par goto 文とほぼ同等に扱うことが出来る。
また、Code Gear は par goto 文で書き出す Output Data Gear を指定して実行するため、Data Gear の書き出し元が推測しやすい。

Go 言語での OpenMP と同様に Twice を実装しGears OS と比較を行う。
こちらも実行環境は \tabref{powerEdge}、 $2^{27}$ のデータに対して行い、Gears OS、Go 言語両方とも配列を64個のTask、 goroutineに分割して並列実行を行った。

\begin{figure}[htbp]
    \begin{center}
        \includegraphics[scale=0.6]{./fig/vsgo.pdf}
    \end{center}
    \caption{vs Go}
    \label{fig:vsgo}
\end{figure}

実行結果として Go 言語は 1CPUと32CPU で約4.33 倍の速度向上が見られた。
こちらも OpenMP と同じく、台数効果自体は Gears OS が高いが、1CPU での実行時間はGo 言語が大幅に速くなっている。