GTC 2015 - Deep Learning用のCUDAライブラリ「cuDNN」
そうすると、もとのイメージやフィルタの行列をGPUのシェアードメモリに転送してやれば、LINPACKなどで長年にわたって最適化されてきた行列積の計算法が使える。このやり方では、GPUのシェアードメモリにデータを転送するときに並べ替えを行ってやれば良い。しかし、イメージの格納形式やストライドの違いなどがあり、並べ替えのアドレス計算に手間が掛かる。
しかし、どのアドレスのデータをどこに持っていくかは、データの格納方法やストライドに依存するのでアドレス計算に手間が掛かる。
別の方法としては、並べ替えのインデックスは事前に計算しておき、それを見て並べ替えを行うという方法がある。
この手法をAlexnetとOverfeatに適用した結果が次の図である。1層目では性能はあまり上がっていないが、2層目以降では47~48%と大きな改善が得られている。
cuDNNの呼び出しでは、どのアルゴリズムでConvolutionを計算するかを直接指定することもできるが、NO_WORKSPACEを選ぶとワークスペースを使わない直接法が使われ、PREFER_FASTESTを選ぶと、必要なワークスペース量は気にせず、一番早いアルゴリズムが使われる。