がここマルチスレッド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の結果に比べて間違っていることを把握します。精度の誤差がごくわずかであれば間違っているとは言いません。さらに、私はプログラムがこれらの条件の下でも実行することを守ってください。
- 利用代わりのG ++のICC、
- 、
- を-fopenmpフラグを削除する使用++ &アトラスグラムの代わりに、ICC & MKL
- 設定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
ありがとうございます!なぜこのエラーが出るのかまだ分かりませんが、リンク構成を設定した後、結果は正しいです。ちなみに、GCC 4.8.4でもこのエラーが出ます。 –
@chainroはmkl_rtさんのバグかもしれません。これは新しいです。 – kangshiyin