PEZY-SC2のコア内同期モードを用いてコア内の4スレッドをSIMD的に使いたいのですが、使い方及び動作について質問があります。
- コア内同期モードを有効化、無効化する方法
- コア内同期モードをSIMD的に用いる場合の、SIMDとの相違点(コア内で分岐が発生した場合の動作など?)
以上について教えていただきたく、よろしくお願いします。
コア内同期モードはアセンブラを用いて記述して頂く必要があります。
例えば以下のようにすると、コア内同期モード、かつ自動chgthreadモードとなります。
__asm__ __volatile__("c.sync.ci 1");
このc.syncの後ろにつく接尾辞でiを指定することでコア内同期モード、cを指定することで自動chgthreadとなります。
なおc.syncの代わりにc.wflushを指定した場合も、このモードは変更されます。
また、ここに記述するsync(あるいはwflush)のレベルは以下に記述したものと同等です。
このモードはそれ以外のsyncやflushを記述することで変化します。
例えば
__asm__ __volatile__("c.sync.ci 1");
の後に
flush()
を発行すると、flushは
__asm__ __volatile__("c.wflush 8");
と同等なのですが、これにはcやiの接尾辞がつかないため、モードはもとに戻ります。
もしもモードを維持してflushを行いたい場合には
__asm__ __volatile__("c.wflush.ci 8");
とする必要があります。
2.につきましては長くなるので別途返答します。
コア内同期モードにつきましては
https://portal.pezy.jp/wp-content/uploads/2018/06/pezy_sc2_features_20170116.pdf
のp18以降に記述していますが、基本はパイプラインステージを揃えるだけです。
プログラムカウンタの値そのものを揃えるわけではないので、それぞれのスレッドが勝手に分岐をしても(機能的には)動作をします。
ただしどこかのスレッドがストールを発生した場合には、それに合わせて他のスレッドもストールをするため、性能的には損をすることとなります。