一度覚えたけど忘れてしまったのでメモ
SIMDとかGPGPUとかやる時に地味に必要な知識
適当に調べたので間違ってる可能性あり

CPU
1コアあたり1clockあたりの積和スループット
Intel core(core 2 duo等)128ADD+128MUL
Nehalem(第1世代)128ADD+128MUL
Sandy Bridge(第2世代)256ADD+256MUL
Ivy Bridge(第3世代)256ADD+256MUL
Haswell(第4世代)256FMA+256FMA
Broadwell(第5世代)256FMA+256FMA
Skylake(第6世代)256FMA+256FMA
Kaby Lake(第7世代)256FMA+256FMA
Coffee Lake(第8世代)256FMA+256FMA
Skylake-X(第6世代)512FMA+512FMA
Knights Landing(Xeon Phi等)512FMA+512FMA
Zen1128ADD*2+128MUL*2※
Zen2256ADD*1+256FMA*2

※MUL演算器はFMAもできるがその場合ADDが停止する
(2018/11/8追記)Zen1ではSIMDスループット低くどうなんだと思っていたけど、まぁなんだかんだコア数でカバーしてて結果悪くはないと思ってた。Zen2は14nm→7nmになってSIMD幅2倍になり、これが本当ならば凄いと思う→すごかった!



GPU
1SM(1CU)あたりの
CUDAコア数(PE数)
warp実行
cycle
1CUDAコアあたりの
レジスタ(32bit)本数
1SMあたりの
共有メモリ
Tesla84??
Fermi322102448KB
Kepler1922341.3348KB
Maxwell128151264-96KB?
Pascal(GP104)1281102464KB
Volta6421024128KB?
Turing642102496KB?
Ampere6421024164KB?
GCN(Tahiti)644102464KB
RDNA641102464KB


参考
https://news.mynavi.jp/photo/article/20170814-vega/images/004l.jpg
etc


余談
一般的にGPUプログラミングにおいて命令レイテンシ隠ぺいとメモリアクセスレイテンシ隠蔽のため、warp(≒wavefront)をたくさん立ち上げることが良いとされる。
一方チューニングされたコードは、例えば1SM内で128threadを立ち上げ、その128threadで共有メモリとレジスタを使いきる・・みたいな処理が考えられる。
その際1SM内で使える共有メモリの最大量やレジスタ量が分かっていないと何かと不便だと思った。またプロファイラ使わないでもこれでOccupancyがだいたい想定できたりする。

「warp実行cycle」についてだが、AMDではwarpでなくwavefrontという。それぞれNVIDIA GPUでは1warp=32thread、AMDのGCNは1wavefront=64thread、AMDのRDNAは1wavefront=32threadとなってて並列処理の最小単位みたいなもので、これを何サイクルで実行するのかという項目。
GCNでいうと1CU(SMみないなもん)=64PE(CUDAコアみたいなもん)なのだが、64PE(processing element)で64threadを1cycleで実行するというものではない
1CUあたりせっかく64PEあるのに、16PEが4cycleで1wavefrontを実行するという形になっている。もちろんwavefrontがたくさんある状況下では64PEが4cycleで4wavefrontを処理するためスループットはちゃんとでるのだが。
もし例えばOpenCLなんかのコードでgroup size(=local work size)が64で、1CU内で64threadが共有メモリとレジスタをほぼ使い切るような処理を書いてしまうと、16PEがその1wavefrontを実行しその間残りの48PEがお留守になってしまうという痛ましいことになる。
なのでgroup sizeを64じゃなく256でやるか、どうしても64のままがいいならその分共有メモリやレジスタの使う量を1/4に減らさないとPEを使い切ることができない。

昔原因がわからなくハマって最近調べてやっと分かったため上記にまとめてメモを残そうと思った