2016-06-30 12 views
0

がここマルチスレッドMKL cblas_sgemmとG ++エラー

#include <mkl.h> 
#include <iostream> 
#include <cstdlib> 
#define ITERATION 1 

int main() 
{ 
    int ra = 128; 
    int lda = 75; 
    int ldb = 55; 
    float* left = (float*)calloc(ra * lda, sizeof(float)); 
    float* right = (float*)calloc(ldb * lda, sizeof(float)); 
    float* ans = (float*)calloc(ra * ldb, sizeof(float)); 
    std::cout << "left " << std::endl; 
    for (int i = 0; i < ra; ++i) { 
    for (int j = 0; j < lda; ++j) { 
     left[i * lda + j] = static_cast <float> (rand())/static_cast <float> (RAND_MAX); 
     std::cout << left[i * lda + j] << " "; 
    } 
    std::cout << std::endl; 
    } 

    std::cout << "right " << std::endl; 
    for (int i = 0; i < lda; ++i) { 
    for (int j = 0; j < ldb; ++j) { 
     right[i * ldb + j] = static_cast <float> (rand())/static_cast <float> (RAND_MAX); 
     std::cout << right[i * ldb + j] << " "; 
    } 
    std::cout << std::endl; 
    } 

    for (int i = 0; i < ITERATION; ++i) { 
    cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, ra, ldb, lda, 1.0f, left, lda, 
     right, ldb, 0.0f, ans, ldb); 
    } 

    std::cout << "ans " << std::endl; 
    for (int i = 0; i < ra; ++i) { 
    for (int j = 0; j < ldb; ++j) { 
     std::cout << ans[i * ldb + j] << " "; 
    } 
    std::cout << std::endl; 
    } 

    return 0; 
} 

私はプログラムを実行した後OMP_NUM_THREADSが16

に設定されているオプション-fopenmp -lmkl_rtによるG ++でこのプログラムをコンパイルSGEMMプログラムの一例です私は、答えは、正確には、MATLABの結果に比べて間違っていることを把握します。精度の誤差がごくわずかであれば間違っているとは言いません。さらに、私はプログラムがこれらの条件の下でも実行することを守ってください。

  1. 利用代わりのG ++のICC、
  2. を-fopenmpフラグを削除する使用++ &アトラスグラムの代わりに、ICC & MKL
  3. 設定OMP_NUM_THREADS = 1

したがって、私はこの問題が-fopenmpフラグにあると考えています。あなたは問題を理解するのを助けることができますか?ありがとうございました!

グラム++(GCC)4.4.7 20120313(レッドハット4.4.7-16)

ICC(ICC)16.0.3 20160415

のLinuxコア2.6.32-279.el6.x86_64

答えて

0

MKL link line advisorによると、あなたはマルチスレッドを有効にするために単一の動的libray -lmkl_rt-fopenmpを使用する必要はありません。 gccが古いため、これは問題の可能性があります。

伝統的なダイナミックリンクを使用して、次の設定を比較して、どの問題があるかを調べることができます。

スレッドMKL + GNU OpenMPの

Link options: -Wl,--no-as-needed -L${MKLROOT}/lib/intel64 -lmkl_intel_lp64 -lmkl_core -lmkl_gnu_thread -lpthread -lm -ldl   
Compile options: -fopenmp -m64 -I${MKLROOT}/include 

スレッドMKL +インテルのOpenMP

Link options: -Wl,--no-as-needed -L${MKLROOT}/lib/intel64 -lmkl_intel_lp64 -lmkl_core -lmkl_intel_thread -liomp5 -lpthread -lm -ldl 
Compile options: -m64 -I${MKLROOT}/include 
+0

ありがとうございます!なぜこのエラーが出るのかまだ分かりませんが、リンク構成を設定した後、結果は正しいです。ちなみに、GCC 4.8.4でもこのエラーが出ます。 –

+0

@chainroはmkl_rtさんのバグかもしれません。これは新しいです。 – kangshiyin

関連する問題