QPU: nopレジスタはスレッド[12:15]が直前にraddrに指定したレジスタの値を返す

VideoCore IV QPU のnopレジスタ (39番) AB を読むと, スレッド[12:15]がそれぞれ直前に raddr_araddr_b に指定したレジスタの 値が返されることが分かった.

例1

例を示す.プログラムを以下とする.


li cond_add=al waddr_add=ra0 imm=7
alu
alu raddr_a=ra0
alu cond_add=al op_add=or waddr_add=r0 raddr_a=nop add_a=ra add_b=ra
  

これを実行すると,r0 には [7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7]が入る. ここで,プログラムの3行目においてはALUのconditionは両方とも never であり,ALUが動いていないことに注意されたい. ALUを動かさない場合でも nop レジスタには 直前に raddr_a に指定したレジスタの値が代入されるのだ.

例2

ABnop レジスタを 同時に使用してみよう. プログラムを以下とする.


li cond_add=al waddr_add=ra0 imm=3
li cond_mul=al waddr_mul=rb0 imm=4
alu
alu raddr_a=ra0 raddr_b=rb0
alu cond_add=al op_add=or waddr_add=r0 raddr_a=nop add_a=ra add_b=ra
alu cond_add=al op_add=or waddr_add=r1 raddr_b=nop add_a=rb add_b=rb
alu cond_add=al op_add=add waddr_add=r2 raddr_a=nop raddr_b=nop add_a=ra add_b=rb
  

これを実行すると以下が得られる.

上から,nopレジスタのABが 独立していることがわかる. また,nopレジスタをraddrに指定しても nopレジスタの値は変化しないことを抑えておきたい.

例3

nopレジスタから返される値がスレッド[12:15]によって 直前にraddrに指定されたレジスタのものであることを確認する. プログラムを以下とする.


alu raddr_a=element_number
alu cond_add=al op_add=or waddr_add=r0 raddr_a=nop add_a=ra add_b=ra
  

これを実行すると,r0には [12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15, 12, 13, 14, 15] が入る. これは,nopレジスタから返される値がスレッド[12:15]によって 直前にraddrに指定された レジスタのものであることを示している. このことはvpm_readraddrに指定することによっても 確かめることができる.

例4

今回紹介した手法により,1命令において最大4個のレジスタ (うち2個はnopレジスタ) に対して値を書き込むことができる. プログラムを以下とする.


li cond_add=al waddr_add=ra0 imm=3
li cond_add=al waddr_mul=rb0 imm=4
alu
alu cond_add=al cond_mul=al op_add=sub op_mul=v8adds waddr_add=r0 waddr_mul=r1 raddr_a=ra0 raddr_b=rb0 add_a=rb add_b=ra mul_a=ra mul_b=rb
  

プログラムの4行目において, r0に$4-3$の結果を,r1に$4+3$の結果を, nopレジスタのAに$3$を, nopレジスタのBに$4$を代入している.

Copyright notice

© 2017 Yukimasa Sugizaki. All rights reserved.

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.