超越関数などを計算するユニット)が小さく書かれているが、実際の数は同じだ。GP100では、SM内は2つのブロックに分かれ、1つのブロックで2つのWARP(スレッドの集まり。GPUのスレッド実行単位)並列実行していたが、GV100のSMは、内部が4つのブロックとなり、それぞれでWARPを実行する。SMの半分だが、WARPあたりの割り当て量は同じになる。Coreのところをよく見ると64個の小さな矩形が書かれている。これは、行列演算を行なう場合の演算ユニットを表す。Coreは、4×4の行列A、B、Cに対して、C=A・B+Cという演算を行なう。この演算は、2つの4×4の行列AとBで内積演算(結果は4×4の行列となる)を行ない、これを行列C(やはり4×4)に加算していくというもの。AとBを変えて演算を繰り返していくとCにその結果が加算されていく。Coreは、4×4の行列の演算を1命令で行える。具体的には4×4の行列(64個のFP16数値)同士の内積を取り、結果をもう1つの4×4行列に加算していくこのとき4×4行列の内積(A・B)演算では、64個の乗算が必要になるが、そのための乗算ユニットを表しているのがこの小さな矩形の意味である。このとき、内積を行なう2つの行列の各要素は半精度浮動小数点(FP16)であり、内積を行うと有効桁数が増えFP32相当となり、これをFP32で表現されているCに加算していく。Coreが2個、SMあたり8個が搭載されている。Coreは、2クロックで4×4の内積と加算を完了できる。思われるかもしれないが、行列の内積計算は、行列を複数のブロック行列に分解して計算させることができる。このため、4×4行列の計算が高速にできるなら、これを組みあわせてより要素数の多い行列の計算が可能だ。これを繰り返すことで、さらに大きな行列であっても内積計算ができる。いわゆるディープラーニングと呼ばれるAI技術では、多数のニューロンを接続したニューラルネットワークを使う。学習時には、個々のニューロンが持つパラメーター(重みとも呼ばれる)を計算する必要がある。このとき、ニューラルネットワーク内で、レイヤーとレイヤー内のニューロンの位置を適切な方法で添え字を付けて表現すると、学習処理や推論処理をテンソル計算としてすることが可能になる。Flowで、その登場以来、ディープラーニングの学習、推論処理を「テンソル演算」と呼ぶことが多くなった。テンソルとは、数値(スカラー、大きさのみ、0階のテンソル)、ベクトル(大きさと方向、1階のテンソル)の上位となる数学的な概念(次元が違うのではなく、階数が違う)だ。テンソル演算は、行列演算の組合せでできるため、行列計算を高速化することで、学習や推論処理を高速にすることが可能になる。Coreは、それを狙ったもの。ディープラーニング用の機能だといえる。Core数]×128[行列演算の演算数]×1.453GHz[動作クロック]≒120テラオペレーションという計算だ。NVIDIAが提供している計算ライブラリcuBLASを使った行列計算では、V100に最適化されたライブラリとP100のライブラリでは、2048×2048のFP16の行列の乗算を行わせたときに9.3倍の高速になるという。NVIDIAが提供しているライブラリ(cuBLAS)により行列演算の比較。Pascalに対して9.3倍の速度があるもう1つの大きな変更点は、スレッドの制御だ。Pascalまでのスレッドは、32スレッドをまとめたWARPで1つのグループを作り、同一のコードを並列実行する(対象データはスレッドごとに違う)。このため、この32スレッドは、プログラムカウンタを共有していた。WARP内の32スレッドは、まったく同じように動作していたわけだ。これに対してVoltaでは、WARPは同じく32スレッドだが、それぞれのスレッド用のプログラムカウンタを持つようになり、スレッドごとに独立してコードを実行できるようになった。Pascalまでは、32スレッドまとめたWARPがプログラムカウンタを共有しているため、32スレッドが完全に同期して動作していた。これに対してVoltaでは、スレッドごとにプログラムカウンタを持ち、それぞれが個別に動作できるただし、WARPで行う処理によっては、実行中のある時点で、すべてのスレッドが特定の処理を終了していることが必要になる。スレッドの演算結果を他のスレッドが利用するような依存関係がある場合だ。このような場合には、スレッド間で実行位置を合わせる「同期」を行うことができる。した改良により、従来は利用できなかったアルゴリズムを採用することが可能になったという。ServiceもSM割り当てのアルゴリズムが変更になり、プロセスごとにまとめて割り当てができるようになり、SMの利用効率が向上している。このためにプロセス起動が早くなり、より多くのプロセスを同時に処理できる。Serviceでプロセスの実行を制御するようになり、効率的なプロセス資源割り当てが可能になった。従来のPascalでは、CPU側でプロセスを起動させていたため、資源割り当ての状態が不明で効率的な実行ができなかったまた、Voltaでは、L1キャッシュについても変更があった。Pascalアーキテクチャでは、L1キャッシュはSMあたり24KBでリードオンリー(つまり書き込みはL2キャッシュへ直接行なわれる)で、それを補うために64KBの読み書き可能な共有メモリが装備されていた。Pascalは、24KBのL1キャッシュと64KBの共有メモリを持っていたが、Voltaでは共有メモリを廃し、128KBの読み書き可能なL1キャッシュとしたソフトウェアの開発時に必要なデータをあらかじめ共有メモリに入れておいたり、テンポラリな値をここに書き込んでおくことで、高速にアクセスできたが、開発者が使い方を考える必要があった。これに対して、Voltaでは、L1キャッシュを128KBと増量し書き込みも可能にした。GV100全体では10MBを搭載している。共有メモリは廃止している。これにより、開発者は、共有メモリの使い方を考えることなく、128KB以内であれば、データのアクセスはL1キャッシュを介してできようになり、Pascalの共有メモリよりも高速にデータにアクセスが可能になり、かつ、より大きなデータに高速にアクセスできる。L2キャッシュも4MBから6MB(SMあたり)に増量されており、平均メモリアクセス時間が向上している。GV100ではL1キャッシュが大量に増やされ、L2キャッシュよりも大きくなっている。P100では720GB/秒)になった。Memory)の接続バンド幅が拡大している。V100のパッケージ上に集積されているまた、CPU側とユニファイドメモリを構成するためのNVLinkも強化され、転送速度が300GB/秒と1.9倍(GP100では160GB/秒だった)になっている。Expressブリッジを使っての接続。IBMのPower8以降はNVLinkを装備)を介して、メモリ領域をお互いにコピーすることで実現している。1つのメモリデバイスを共有するのではなく、それぞれに接続されたメモリ間でメモリ内容のコピーすることで、見かけ上、同じメモリを読み書きしているように見せている。Pascal世代では、このために、片方がメモリにアクセスしている間には、メモリコピーが行えず,アクセスが双方で続くとページデータのコピーが多発する。Voltaに装備されたNVLink2では、まず、相手側にあるメモリへのリモートアクセスをサポートした。これにより、低頻度のアクセスでは、ページのコピーが発生しない。ページに対するアクセスカウンタが装備され、どちらかが高い頻度でアクセスを行なうと、ページを移動させるようになった。Memoryシステムも改良され、低頻度の場合には、メモリページをコピーせず、GPU側からCPU側のメモリへリモートアクセスできるようになった。アクセスカウンタがあり、アクセス頻度が上がるとページがGPU側にコピーされるこの改良によりメモリの一貫性維持やアトミックオペレーション(動作が分割されずに実行される動作)時の動作効率が上がっている。同じメモリページに同時にアトミック処理を行なう場合、Pascal世代では、片方のアトミックオペレーションが終了したのちにメモリをコピーしてもう1つのアトミックオペレーションを実行していたが、Voltaでは、NVLinkを介してページコピーを起こさずに相手側メモリでアトミックオペレーションを実行する。