QPU: 命令,uniforms及びL2キャッシュのサイズと特性

概要

命令,uniforms及びL2キャッシュについて,以下のことがわかった.

ここで,パフォーマンスカウンタが全QPUコアで共通であるということを, QPU$1$コアの$1$スレッドにおけるカウントが 該当するパフォーマンスカウンタの値になることと定義する.

命令,uniforms及びL2キャッシュのパフォーマンスカウンタについて,以下のことがわかった.

実験環境

実験環境として Raspberry Pi 2 Model B を使用した. オーバークロックを施していないため,QPU の1コアは $250 / 4 = 62.5$ MHz で動作するとした.

プログラムの流れ

実行するプログラム全体の命令数を$I$とし, これを$3$以上$603$以下の整数として変化させた. プログラム中ではジャンプ命令を用いていないため, $I$ 個の命令を実行するとプログラムの実行は停止する. プログラムは$10$回実行し,平均値をパフォーマンスカウンタの測定値とした.

結果

パフォーマンスカウンタにより測定した 命令キャッシュ,uniformsキャッシュ,L2キャッシュのヒット数をそれぞれ $H_{inst}$,$H_{unif}$,$H_{L2}$ とし, 命令キャッシュ,uniformsキャッシュ,L2キャッシュのミス数をそれぞれ $M_{inst}$,$M_{unif}$,$M_{L2}$ とする.

それぞれの$I$において, すべての実行におけるパフォーマンスカウンタの値が一致した (平均をとるまでもなかった).

考察

$n$を,L2キャッシュからuniformsキャッシュに一度にフェッチされるバイト数とする. $n$は$2$以上$16$以下であると仮定する.

$H_{inst}$と$I$が一致したことより,以下のことがわかる.

$M_{inst}$と$\ceil{I / 8}$すなわち$\ceil{H_{inst} / 8}$が一致したことより,以下のことがわかる.

プログラム中でuniform_readレジスタを読まなかったにも関わらず $H_{unif}$が非$0$であったことより,以下のことがわかる.

上記キャッシュを以下「uniforms L0キャッシュ」と記す.

$H_{unif}$が$1$または$2$, つまりuniformsストリームがuniforms L0キャッシュに $4$または$8$バイト ($1$または$2$要素) キャッシュされたことと, $M_{unif}$が$1$であったことより,以下のことがわかる.

$M_{unif}$と$\ceil{H_{unif} / n}$が一致したことより,以下のことがわかる.

$H_{L2}$ が$0$であったにも関わらず $M_{L2}$ が非$0$であったことから,以下のことがわかる.

$M_{L2}$ が $\ceil{H_{inst} / 8} + 1$ と一致したが, これは $M_{L2}$ が $\ceil{H_{inst} / 8} + \ceil{H_{unif} / 16}$と 一致したと考えられる. このことから,以下のことがわかる.

Copyright notice

© 2016 Yukimasa Sugizaki. All rights reserved.

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.