2013-11-01 14 views
6

私は小さなモデル(50〜100 x 1000要素)でいくつかのMKLコールを実行してモデルに適合させ、別のモデルを呼び出すルーチンがあります。モデルは独立しているのでインテル・フィリピンでのMKLパフォーマンス

double doModelFit(int model, ...) { 
    ... 
    while(!done) { 
    cblas_dgemm(...); 
    cblas_dgemm(...); 
    ... 
    dgesv(...); 
    ... 
    } 
    return result; 
} 

int main(int argc, char **argv) { 
    ... 
    c_start = 1; c_stop = nmodel; 
    for(int c=c_start; c<c_stop; c++) { 
    ... 
    result = doModelFit(c, ...); 
    ... 
    } 
} 

は、上記のバージョン1を呼び出し、次のように、私は、フィッティングモデルを並列化するOpenMPスレッドを使用することができる(バージョン2):擬似コードで

int main(int argc, char **argv) { 
    ... 
    int numthreads=omp_max_num_threads(); 
    int c; 
#pragma omp parallel for private(c) 
    for(int t=0; t<numthreads; t++) { 
    // assuming nmodel divisible by numthreads...  
    c_start = t*nmodel/numthreads+1; 
    c_end = (t+1)*nmodel/numthreads; 
    for(c=c_start; c<c_stop; c++) { 
     ... 
     result = doModelFit(c, ...); 
     ... 
    } 
    } 
} 

ホストマシン上でバージョン1を実行すると、11秒かかり、VTuneはほとんどの時間がアイドル状態になっているために貧弱な並列化を報告します。ホストマシン上のバージョン2は約5秒かかるため、VTuneは大きな並列化を報告しています(100%近い時間は8個のCPUを使用しています)。現在、Phiカードをネイティブモード(-mmic)で実行するようにコンパイルすると、mic0のコマンドプロンプトでバージョン1と2の両方が約30秒かかります。私はそれをプロファイルするインテル®VTuneを使用する場合:

  • バージョン1は同じ約30秒かかり、およびホットスポット分析は、ほとんどの時間は__kmp_wait_sleepと__kmp_static_yieldに費やされていることを示しています。 7710秒のCPU時間のうち、5804秒がスピン時間に費やされます。
  • バージョン2はfooooorrrreevvvverを取る...私はVTuneで数分間実行した後にそれを削除します。ホットスポット分析では、CPU時間が25254秒で、[vmlinux]で21585秒が費やされたことが分かります。

ここで何が起こっているのか、誰がそのような悪い成果を得ているのか、誰にも分かりますか?私はOMP_NUM_THREADSのデフォルトを使用し、KMP_AFFINITY = compact、granularity = fine(Intelが推奨する)を設定しています。私はMKLとOpenMPの新人ですから、私はルーキーミスをしていると確信しています。

おかげで、 アンドリュー

+1

MKLには、Phiの小さな行列で重大なパフォーマンス上の問題があります。私はインテルのフォーラムであなたの質問を投稿することをお勧めします:http://software.intel.com/en-us/forums/intel-many-integrated-core – pburka

+1

@pburka私もそこに投稿しました。ちょうど広いネットをキャストしようとしています。 :)小さな行列問題のリンクがありますか? – Andrew

+1

ここに1つの問題http://software.intel.com/en-us/forums/topic/475924があります。私はまた、プレミアサポートを通じてインテルにフォローアップしています。この場合、MKLはスレッド数を30に減らし、GEMM呼び出し後にスレッドをスピンアップさせるのに1msかかると思います。しかし、私はこれが唯一のGEMMのパフォーマンス上の問題ではないとも考えています。 – pburka

答えて

1

、ほとんどの時間は、OS(のvmlinux)に費やされていることを考えると、この動作のための最も可能性の高い理由は、オーバーサブスクリプションcblas_dgemm()dgesvのMKL実装の中にネストされたOpenMPの並列領域によって引き起こされます。例えば。 this exampleを参照してください。

このバージョンは、Intel forumのJim Dempseyによってサポートされ、説明されています。

0

MKL:シーケンシャルライブラリの使用についてはどうですか? MKLライブラリをシーケンシャルオプションとリンクすると、MKL自体の中にOpenMPスレッドは生成されません。私はあなたが今より良い結果を得るかもしれないと思います。

+0

これは質問に対する答えを提供しません。批評をしたり、著者の説明を求めるには、自分の投稿の下にコメントを残してください。自分の投稿にいつもコメントをつけることができます。そして、十分な[評判](http://stackoverflow.com/help/whats-reputation) [任意の投稿にコメントする]ことができます(http://stackoverflow.com/help/privileges/comment)。 – durron597

+0

一般的に、ツールやライブラリへのリンクや参照には、推奨されるリソースが問題にどのように適用されるかについての具体的な説明だけでなく、[使用上の注意やサンプルコードも併せてください](http://meta.stackoverflow .com/a/251605)。 (@ durron597:技術的には、これは*答えです。 –

関連する問題