VS2019配置oneAPI並呼叫MKL庫
oneAPI
oneAPI是一個跨架構的程式設計工具,旨在簡化跨GPU、CPU、FPGA和AI加速器之間的程式設計,可以與英特爾自身裝置,或其他廠商的晶片配合使用,以優化工作負載。支援多種語言,支援跨架構效能加速,以提高程式設計師的生產力。
其中的oneMKL(數學核心庫),是一個高度優化和廣泛並行化的例程庫,旨在提供跨各種CPU和加速器的最高效能。該庫具有用於大多數例程的C和Fortran介面,全面支援多種數學運算,包括:
- 線性代數
- 快速傅立葉變換
- 向量
- 直接和迭代的稀疏求解器
- 隨機數生成器
下載
Intel oneAPI下載地址為Download the Intel® oneAPI Base Toolkit
安裝
預設路徑,Extract
下一步,下一步就OK
選擇自定義安裝,預設路徑為C:\Program Files (x86)\Intel\oneAPI
安裝選項中取消勾選了15G的Intel for Python
工具包會整合到VS中
install
安裝過程大概需要花費20分鐘
配置環境(VS2019)
(1)新建工程並建立main.cpp,解決方案配置為Debug x64
;
(2)進入屬性頁面;在 配置屬性 — > VC++目錄 中分別需要配如圖三個路徑。(預設下載位置為C:\Program Files (x86)\Intel)
可執行檔案目錄: C:\Program Files (x86)\Intel\oneAPI\mkl\2022.0.3\bin\intel64
包含目錄:C:\Program Files (x86)\Intel\oneAPI\mkl\2022.0.3\include
庫目錄:C:\Program Files (x86)\Intel\oneAPI\compiler\2022.0.3\windows\compiler\lib\intel64_win
C:\Program Files (x86)\Intel\oneAPI\mkl\2022.0.3\lib\intel64
設定好後點選“應用”
(3)在C:\Program Files (x86)\Intel\oneAPI\mkl\2022.0.3\documentation\en\common
找到mkl_link_line_advisor.htm
網頁開啟:
如在win64環境下,需要新增以下庫:
mkl_intel_ilp64.lib
mkl_intel_thread.lib
mkl_core.lib
libiomp5md.lib
(4)在連結器 — > 輸入 複製/貼上;新增附加依賴項
測試程式碼
#include<stdio.h>
#include<stdlib.h>
#include"mkl.h"
#include"mkl_lapacke.h"
#define n 4
void main() {
int matrix_order = LAPACK_COL_MAJOR;
char jobvl = 'N';
char jobvr = 'V';
double A[n * n] = {
0.35, 0.09, -0.44, 0.44,
0.09, 0.07, -0.33, 0.52,
-0.44, -0.33, -0.03, -0.1,
0.44, 0.52, -0.1, 0.35 };//4*4矩陣
int lda = n;
double wr[n] = { 0 };
double wi[n] = { 0 };
double vl[n * n];
int ldvl = n;
double vr[n * n];
int ldvr = n;
int info = LAPACKE_dgeev(matrix_order, jobvl, jobvr, n, A, lda, wr, wi, vl, ldvl, vr, ldvr);
//int info=0;
if (info == 0) {
int i = 0;
int j = 0;
int flag = 0;//區分復特徵值的順序
for (i = 0; i < n; i++) {
printf("eigenvalue %d:", i);
printf("%.6g + %.6gi\t", wr[i], wi[i]);
printf("\n");
printf("right eigenvector: ");
if (wi[i] == 0)
{
for (j = 0; j < ldvr; j++) {
printf("%.6g\t", vr[i * n + j]);
}
}
else if (flag == 0)//如果該復特徵值為這對復特徵值的第一個則
{
flag = 1;
for (j = 0; j < ldvr; j++)
{
printf("%.6g + %.6gi\t", vr[i * n + j], vr[(i + 1) * n + j]);
}
}
else if (flag == 1)//如果該復特徵值為這對復特徵值的第二個則
{
flag = 0;
for (j = 0; j < ldvr; j++)
{
printf("%.6g + %.6gi\t", vr[(i - 1) * n + j], -vr[i * n + j]);
}
}
printf("\n");
}
getchar();//必須要有這句
printf("SUCCESS\n");
}
system("pause");
}
輸出為
配置完成!