ps3 PPUとSPUのSIMD逆数命令のスピード

ここでは、「ps3 PPUとSPUのSIMD逆数命令のスピード」 に関する記事を紹介しています。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
PS3にFedora7、CellSDK3.0を入れて実験中。
SIMD逆数命令について速度を比較してみた。

調査対象
PPU側:vector float vec_re(vector float a);
     vector float vec_re_nrm(vector float a); NewtonRaphson法で近似精度を高める関数
SPU側:vector float spu_re(vector float a);
     vector float spu_re_nrm(vector float a); NewtonRaphson法で近似精度を高める関数

コンパイルオプション
ppu-gcc -O6 -maltivec -mabi=altivec
spu-gcc -O6

次の命令を32億回実行して所要時間を確認した。クロックが3.2Ghzなので「時間≒所要クロック数」となると考えての実験。この結果にどれほどの一般性があるかどうかは不明。とりあえず自分用覚え書き。

PPU側
vec_re 1個:18.146秒
vec_re 2個:32.249秒
vec_re 3個:46.338秒
→vec_re関数は14クロックほど、ループ自体は4クロックほどかかる模様。

vec_re_nrm 1個:42.309秒
vec_re_nrm 2個:80.840秒
vec_re_nrm 3個:118.795秒
→vec_re_nrm関数は38クロックほど、ループ自体は4クロックほどかかる模様。


SPU側
spu_re 1個:13.040秒
spu_re 2個:24.067秒
spu_re 3個:35.094秒
→spu_re関数は11クロックほど、ループ自体は2クロックほどかかる模様。

spu_re_nrm 1個:25.140秒
spu_re_nrm 2個:48.127秒
spu_re_nrm 3個:71.184秒
→spu_re_nrm関数は23クロックほど、ループ自体は2クロックほどかかる模様。



使ったコードは次のもの
PPU側

#include < stdio.h >
#include < altivec.h >
float d[4] = { 1.414213562, 1.732050807, 3.141592653, 1.6180339};

inline vector float vec_re_nrm(vector float a )
{
vector float unit = (vector float){1.0, 1.0, 1.0, 1.0};
vector float approximation;

approximation = vec_re( a );
return vec_madd( vec_nmsub( approximation, a, unit ), approximation, approximation);
}

int main(int argc, char **argv)
{
vector float *vd = (vector float *) d;
unsigned int i;

for (i = 0; i < 3200000000; i++) {
*vd = vec_re(*vd); //この行を1~3個に増減させて計測
}
return 0;
}

SPU側

#include < stdio.h >
#include < spu_intrinsics.h >
float d[4] = { 1.414213562, 1.732050807, 3.141592653, 1.6180339};

inline vector float spu_re_nrm(vector float a )
{
vector float unit = (vector float){1.0, 1.0, 1.0, 1.0};
vector float approximation;

approximation = spu_re( a );
return spu_madd( spu_nmsub( approximation, a, unit ), approximation, approximation);
}

int main(int argc, char **argv)
{
vector float *vd = (vector float *) d;
unsigned int i;

for (i = 0; i < 3200000000; i++) {
*vd = spu_re(*vd); //この行を1~3個に増減させて計測
}
return 0;
}

スポンサーサイト
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://tekitobibouroku.blog42.fc2.com/tb.php/28-ec95cfd3
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。