フォワーディング?

http://nothingcosmos.blog52.fc2.com/blog-entry-151.html
なんかコメントに書こうとしたら書き込み制限とか言われて書けない…

http://d.hatena.ne.jp/laysakura/20111113/1321155826
これ単に依存発生している/していないという違いではないかな、と思う。

リンク先の、sse_mulps_addps_forwardingは、xmm{0,4}, xmm{1,5}, xmm{2,6} xmm{3,7} が、それぞれ依存作ってて、並列性が4あるけど、sse_mulps_addps_no_dependencyは、xmm{0,1,2,3}, xmm{4,5,6,7} で依存作っていて、並列性2しか無い。
なので、sse_mulps_addps_forwardingは、sse_mulps_addps_no_dependencyよりIPC高い、という話で、fowarding(?)とかの不思議な現象は発生していないはず。

実際、sse_mulps_addps_forwardingを

      "mulps %0, %%xmm0\n\t"
      "mulps %0, %%xmm1\n\t"
      "mulps %0, %%xmm2\n\t"
      "mulps %0, %%xmm3\n\t"
      "addps %%xmm0, %%xmm4\n\t"
      "addps %%xmm1, %%xmm5\n\t"
      "addps %%xmm2, %%xmm6\n\t"
      "addps %%xmm3, %%xmm7\n\t"

こう書いても、IPCそれほど変わらない。

で、avx_vmulps_vaddps_forwardingは、ループのイテレーションごとに、完全に依存が切れていて、IPC 2 + 分岐命令が入って、IPC 2 overになっているように見える。



あと、x86のmicro-fusionは、メモリオペランドを取るx86演算命令が、メモリアクセス+演算のuopsに分解されない、ぐらいの意味で、複数のx86命令が融合されることは無いはずです。(http://download.intel.com/jp/developer/jpdoc/248966-024JA.pdf の2.1.2.1.の「マイクロフュージョン」あたり)