2016-11-11 78 views
0

我在Visual Studio中编写了一个简单的程序,使用MKL库中的cblas_dgemm函数将2个类型为double的矩阵相乘。这在x86中完美工作。但是,当我切换到x64模式时,我得到垃圾值。是否有声明我必须写或参数我需要改变在x64中使用MKL? 我已经从下面的x86和x64调试模式粘贴了输出。另外我不使用ILP64MKL cblas_dgemm在x64中调试时给我垃圾结果

#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 9821354651473717359695563035291842475740364442536625819208727822253580902880157375484326036957401922300495668501719121212217972048703115306645375045289532.000 3669252151527883650882879225154439634779201105036709633261510558550031781881607608946777435557242020978154455651697127672034635122085159876765319981763404894584455323179401068638393473383612903205233978131817062603866165628370944.000 9576598406140674788853463577457446849100658411025734324791073248973248075712095334842922298642349822371447240257432929894715445313114259564166602659002428082685155628516429230074688724891359202918002033473039106048.000 
+0

我只是想在64位不同的笔记本电脑相同的代码是非常有用的,它完美地工作。我的当前机器有一些问题 – Kumar

回答

0

我修正了这个问题!我不得不去

属性»配置属性»C/C++»代码生成»运行时库

,并从

- 多线程调试DLL(/ MDD)改变:动态英特尔链接MKL库

- 多线程(/ MT):使用静态英特尔MKL库链接

国际空间站我是在做动态连接而不是静态连接。我发现这个网页,帮助我克服这个问题

https://software.intel.com/en-us/articles/intel-math-kernel-library-inte...