MKL cblas_dgemm在x64中调试时给我垃圾结果
MKL cblas_dgemm giving me garbage results when debugging in x64
我正在visual studio中编写一个简单的程序,使用MKL库中的cblas_dgemm函数乘以2个double类型的矩阵。这在x86中可以完美地工作。然而,当我切换到x64模式时,我得到的是垃圾值。在x64中使用MKL时,是否有我必须编写的声明或参数需要更改?我在下面粘贴了x86和x64调试模式的输出。我也没有使用ILP64
#include <mkl.h>
#include <iostream>
#include <iomanip>
#include <cstdlib>
#define n1 12
#define n2 20
#define n3 15
#define size1 (sizeof(double) * 12)
#define size2 (sizeof(double) * 20)
#define sizer (sizeof(double) * 15)
using namespace std;
int main() {
double * mkl_mat1 = (double*)mkl_malloc(size1, 8);
double * mkl_mat2 = (double*)mkl_malloc(size2, 8);
double * mkl_matr = (double *)mkl_malloc(sizer, 8);
for (int i = 0; i < n1; i++) {
double add = ((double)i) / 10;
mkl_mat1[i] = add;
}
for (int i = 0; i < n2; i++) {
double add = (((double)(i)) / 10) + i;
mkl_mat2[i] = add;
}
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, 3, 5, 4, 1, mkl_mat1, 4, mkl_mat2, 5, 1, mkl_matr, 5);
cout << "matrix A:" << endl;
for (int i = 0; i < n1; i++) {
cout << fixed << setprecision(3);
cout << mkl_mat1[i] << " ";
if ((i + 1) % 4 == 0) {
cout << endl;
}
}
cout << endl << "matrix B:" << endl;
for (int i = 0; i < n2; i++) {
cout << mkl_mat2[i] << " ";
if ((i + 1) % 5 == 0) {
cout << endl;
}
}
cout << endl << "result: " << endl;
for (int i = 0; i < n3; i++) {
cout << mkl_matr[i] << " ";
if ((i + 1) % 5 == 0) {
cout << endl;
}
}
mkl_free(mkl_mat1);
mkl_free(mkl_mat2);
mkl_free(mkl_matr);
system("pause");
return 0;
}
这是x86调试的输出。矩阵乘法的结果是正确的。
matrix A:
0.000 0.100 0.200 0.300
0.400 0.500 0.600 0.700
0.800 0.900 1.000 1.100
matrix B:
0.000 1.100 2.200 3.300 4.400
5.500 6.600 7.700 8.800 9.900
11.000 12.100 13.200 14.300 15.400
16.500 17.600 18.700 19.800 20.900
result:
7.700 8.360 9.020 9.680 10.340
20.900 23.320 25.740 28.160 30.580
34.100 38.280 42.460 46.640 50.820
这是我使用x64得到的。如您所见,cblas_dgemm的结果是完全关闭的。
matrix A:
0.000 0.100 0.200 0.300
0.400 0.500 0.600 0.700
0.800 0.900 1.000 1.100
matrix B:
0.000 1.100 2.200 3.300 4.400
5.500 6.600 7.700 8.800 9.900
11.000 12.100 13.200 14.300 15.400
16.500 17.600 18.700 19.800 20.900
result:
93357590358131489749598208.000 2092621572586762403840.000 4987469390756061264329844035377914970112.000 840081208810589537915941265441360790647650203528241571795304448.000 1265439546878571763047336120349965224870150144.000
4291962.185 436361906378867406158334692399598789955786331512676402591277664910164164198641274664924994606214109295966461669812169210474109522783704059707122304404462832655621395047756256406765223308548365248881843421206279880627874460809085834208907100160.000 13231929878462779146578339497339877798921922010371671205674841175110389140714713179395701776807407261768913753318212756050190821210932002094269291681739783953603144153165258692494693046103252723040256.000 28.160 90881598017775964584735574016196848228044002038335559904513002632541601693427142081081275209626819242936591400845048349235711358896439078191053304572463519943645548707404624938627997148332398182386193400701779273442048081920.000
2537893164253223640010795635630559650975318016.000 170998293682572028485580594799506949489271077618286616693147899109522239738912059933878848909596303621717788311103047805626305223755691481550735323302132640120832.000 982135465147371735969556303529184247574036444253662581920872782225358090288015737548432603695740192230049566850171912121221797204870311530664537504528953201237190120366465000992322672490293353741933273323877930430705846845174170063267050815488.000 3669252151527883650882879225154439634779201105036709633261510558550031781881607608946777435557242020978154455651697127672034635122085159876765319981763404894584455323179401068638393473383612903205233978131817062603866165628370944.000 9576598406140674788853463577457446849100658411025734324791073248973248075712095334842922298642349822371447240257432929894715445313114259564166602659002428082685155628516429230074688724891359202918002033473039106048.000
我修复了这个问题!我不得不去
属性>配置属性> C/c++>代码生成>运行库
并从
更改-多线程调试DLL (/MDd):链接动态的Intel MKL库
-多线程(/MT):与静态Intel MKL库链接
问题是我正在做动态链接而不是静态链接。我发现这个网页对我解决这个问题非常有用
https://software.intel.com/en-us/articles/intel-math-kernel-library-inte..。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 当回溯以零开始时,如何调试崩溃
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 在 c++ 中,rand() 在执行有调试和不带调试的程序时生成不同的结果
- 在CLION中调试模式和运行模式之间的怪异结果
- 为什么在类构造函数方法中,std::string 参数在调试时显示不同的结果?
- 为什么Boost Numeric库通过使用调试或发布模式给出不同的结果
- 执行我的代码的.exe结果时错误,但在调试器中执行该代码时没有错误
- 以下代码在 VS 2013 发布/调试中生成不同的结果
- 调试和发布之间的结果不同
- OpenCV 结果在调试/发布和其他机器之间更改
- Valgrind 的调试结果没有向我显示发生错误的行数
- 调试信息会影响分析结果 c++
- C++程序在调试和发布模式下给出了不同的结果
- 为什么浮动计算和强制转换在调试和发布配置中显示不同的结果
- MKL cblas_dgemm在x64中调试时给我垃圾结果
- C++需要在Main()调试中显示结果的帮助
- 调试和发布模式中的不同结果