私は小さなモデル(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の新人ですから、私はルーキーミスをしていると確信しています。
おかげで、 アンドリュー
MKLには、Phiの小さな行列で重大なパフォーマンス上の問題があります。私はインテルのフォーラムであなたの質問を投稿することをお勧めします:http://software.intel.com/en-us/forums/intel-many-integrated-core – pburka
@pburka私もそこに投稿しました。ちょうど広いネットをキャストしようとしています。 :)小さな行列問題のリンクがありますか? – Andrew
ここに1つの問題http://software.intel.com/en-us/forums/topic/475924があります。私はまた、プレミアサポートを通じてインテルにフォローアップしています。この場合、MKLはスレッド数を30に減らし、GEMM呼び出し後にスレッドをスピンアップさせるのに1msかかると思います。しかし、私はこれが唯一のGEMMのパフォーマンス上の問題ではないとも考えています。 – pburka