4

Visual Studio の C/C++ コンパイラに加えて Intel Math Kernel Library (MKL) を使用しています。MKL ライブラリにリンクするために追加のインクルード ディレクトリ、追加のライブラリ ディレクトリ、追加の依存関係変数を設定しましたが、行列乗算のサンプル コードを実行してもリンク エラーが発生しました。

#define min(x,y) (((x) < (y)) ? (x) : (y))
#include <stdio.h>
#include <stdlib.h>
#include "mkl.h"

int main()
{
double *A, *B, *C;
int m, n, p, i, j;
double alpha, beta;
m = 2000, p = 200, n = 1000;
alpha = 1.0; beta = 0.0;

A = (double *)mkl_malloc( m*p*sizeof( double ), 64 );
B = (double *)mkl_malloc( p*n*sizeof( double ), 64 );
C = (double *)mkl_malloc( m*n*sizeof( double ), 64 );
if (A == NULL || B == NULL || C == NULL) {
  printf( "\n ERROR: Can't allocate memory for matrices. Aborting... \n\n");
  mkl_free(A);
  mkl_free(B);
  mkl_free(C);
  return 1;
}

printf (" Intializing matrix data \n\n");
for (i = 0; i < (m*p); i++) {
    A[i] = (double)(i+1);
}

for (i = 0; i < (p*n); i++) {
    B[i] = (double)(-i-1);
}

for (i = 0; i < (m*n); i++) {
    C[i] = 0.0;
}

printf (" Computing matrix product using Intel® MKL dgemm function via CBLAS interface \n\n");
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, 
            m, n, p, alpha, A, p, B, n, beta, C, n);

mkl_free(A);
mkl_free(B);
mkl_free(C);

printf (" Example completed. \n\n");
return 0;
}
4

2 に答える 2

0

MKL Link line advisorを使用できます。さらに、このリンクの手順に従って、MKL を Microsoft Visual Studio にリンクすることもできます。

于 2013-07-29T21:35:55.503 に答える
0

ソース コードはリンカ エラーにはあまり役に立たないので、わかりにくいです。リンカーが関数を見つけることができないと言った場合、ソースが正常にコンパイルされたかどうかに関係なく、正しいライブラリをリンクしていません。

私が探していることの 1 つは、ライブラリディレクトリを指定するだけではよくありません。ライブラリを見つけるときに参照する別の検索パスを指定するだけだからです。リンクする実際のライブラリ自体を指定する必要があります。

これは、質問の情報に基づいて考えられる原因の 1 つです。

于 2012-11-25T02:14:55.013 に答える