2016-08-06 8 views
0

私はSIMDプログラムへのルーキーだなぜ私のスキャッタローンの性能はVc SIMDより優れていますか?

unsigned int Hash(unsigned int f); 
uint_v Hash(uint_v vec); 

int main() 
{ 
     std::random_device rd; 
     unsigned* mem1=new unsigned [_size](); 
     for(int i=0;i<_size;++i) 
       mem1[i]=rd(); 

     time_t t1=clock(); 
     uint_v mem; 
     for(int i=0;i<_size;i+=uint_v::size()) 
     { 
       mem.load(mem1+i,Vc::Unaligned); 
       uint_v temp=Hash(mem); 
     } 
     t1=clock()-t1; 
     std::cout<<"simd time:"<<(1.0*t1)/CLOCKS_PER_SEC<<"\n"; 

     time_t t2=clock(); 
     for(int i=0;i<_size;++i) 
       unsigned int temp=Hash(mem1[i]); 
     t2=clock()-t2; 
     std::cout<<"normal time:"<<(1.0*t2)/CLOCKS_PER_SEC<<"\n"; 

     return 0; 
} 
unsigned int Hash(unsigned int f) 
{ 
     return (f>>7)^(f>>13)^(f>>21)^f; 
} 
uint_v Hash(uint_v vec) 
{ 
     uint_v mem=vec.apply([](unsigned f) ->unsigned{return (f>>7)^(f>>13)^(f>>21)^f;}); 
     return mem; 
} 

私のコードは、上記のように、時間の結果は次のとおりです。
SIMD時間:0.127762 通常時:0.034841
結果がで日付を比較すると類似していますmem1とmem2(Vc uint_vベクトル)

+0

'uint_v'は何の偽の使用にグローバル変数に結果

  • 使用インラインアセンブラ?あなたが投稿した場所のどこにでもその定義は表示されません。署名が異なる場合、ベクトル化されたハッシュ関数はドロップイン置換ではありません。また、どのコンパイルオプションを使用しましたか? (具体的には、最適化が有効になっていますか?最適化がなければ、余分なコード層( '.apply'など)は実際には最適化されません。 –

  • +0

    @PeterCordesはあなたの応答、コンパイルオプションg ++ -o3 xxxxxおよび** uint_v * *は128ビット/ 256ビットのデータを含むSIMD lib Vcで定義されているベクトル型です – imagecmos

    +1

    あなたはこのVcライブラリにリンクしていますが、私はそれが何であるか、またあなたがライブラリについて話していることは知らなかった。 –

    答えて

    1

    測定するものは測定していません。コンパイラは、あなたが計算したものの、決して使用しないすべてのもの(つまり、コンパイラが使用されていない100%のものすべて)に対してデッドコードを削除します。 コンパイラは両方のループでDCEを実行しているはずですが、明らかにVcのケースでは実行できませんでした。

    アイデア:

    • ストア結果
    関連する問題