下载链接:https://software.intel.com/en-us/mkl
文件下载
官网注册后,选择MKL下载下来,安装到指定目录就行,不在多说。
配置文件
首先创建一个Windows桌面项目,再添加一个CPP源文件。
打开项目属性页--配置属性,会多出Intel Performance...这一项,看下图配置
在打开VC++目录,进行配置。我安装MKL的地方在D:IntelSWTools
打开D:IntelSWToolscompilers_and_libraries_2019.5.281windows,由于版本不同,可能后面的版本更新日期可能不同。按照下面根据你的情况添加。
可执行文件目录:D:IntelSWToolscompilers_and_libraries_2019.5.281windowsmklin
包含目录:D:IntelSWToolscompilers_and_libraries_2019.5.281windowsmklinclude
库目录:
D:IntelSWToolscompilers_and_libraries_2019.5.281windowscompilerlibia32_win
D:IntelSWToolscompilers_and_libraries_2019.5.281windowsmkllibia32_win
注意:在选择生成程序时,选择生成x86程序。如果要生成x64程序,那么库文件那里选择intel64_win。
打开链接器,在附加依赖项添加(如果配置64位程序,需要将mkl_intel_c.lib改成mkl_intel_lp64.lib)
mkl_intel_c.lib;mkl_intel_thread.lib;mkl_core.lib;libiomp5md.lib;
配置测试
#include <stdio.h> #include <stdlib.h> #include "mkl.h" #define min(x,y) (((x) < (y)) ? (x) : (y)) int main() { double* A, * B, * C; int m, n, k, i, j; double alpha, beta; printf(" This example computes real matrix C=alpha*A*B+beta*C using " " Intel(R) MKL function dgemm, where A, B, and C are matrices and " " alpha and beta are double precision scalars "); m = 2000, k = 200, n = 1000; printf(" Initializing data for matrix multiplication C=A*B for matrix " " A(%ix%i) and matrix B(%ix%i) ", m, k, k, n); alpha = 1.0; beta = 0.0; printf(" Allocating memory for matrices aligned on 64-byte boundary for better " " performance "); A = (double*)mkl_malloc(m * k * sizeof(double), 64); B = (double*)mkl_malloc(k * n * sizeof(double), 64); C = (double*)mkl_malloc(m * n * sizeof(double), 64); if (A == NULL || B == NULL || C == NULL) { printf(" ERROR: Can't allocate memory for matrices. Aborting... "); mkl_free(A); mkl_free(B); mkl_free(C); return 1; } printf(" Intializing matrix data "); for (i = 0; i < (m * k); i++) { A[i] = (double)(i + 1); } for (i = 0; i < (k * n); i++) { B[i] = (double)(-i - 1); } for (i = 0; i < (m * n); i++) { C[i] = 0.0; } printf(" Computing matrix product using Intel(R) MKL dgemm function via CBLAS interface "); cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, m, n, k, alpha, A, k, B, n, beta, C, n); printf(" Computations completed. "); printf(" Top left corner of matrix A: "); for (i = 0; i < min(m, 6); i++) { for (j = 0; j < min(k, 6); j++) { printf("%12.0f", A[j + i * k]); } printf(" "); } printf(" Top left corner of matrix B: "); for (i = 0; i < min(k, 6); i++) { for (j = 0; j < min(n, 6); j++) { printf("%12.0f", B[j + i * n]); } printf(" "); } printf(" Top left corner of matrix C: "); for (i = 0; i < min(m, 6); i++) { for (j = 0; j < min(n, 6); j++) { printf("%12.5G", C[j + i * n]); } printf(" "); } printf(" Deallocating memory "); mkl_free(A); mkl_free(B); mkl_free(C); printf(" Example completed. "); system("PAUSE"); return 0; }