我想在我的一个头文件中实现mkl_lapack的tridiagonal特征值算法 dstevr
#include "mkl.h"
void trideigs(int N, int LDZ, double *Z, double *W, double *D, double *E){
double VL=0.0, VU=1.0, ABSTOL=0.0;
int IL=1, IU=N, M=N, LWORK=20*N, LIWORK=10*N, INFO;
int *ISUPPZ=(int*)malloc(2*M*sizeof(int));
int *IWORK=(int*)malloc(LIWORK*sizeof(int));
W=(double*)malloc(N*sizeof(double));
Z=(double*)malloc(LDZ*M*sizeof(double));
double *WORK=(double*)malloc(LWORK*sizeof(double));
dstevr("V","A",&N,D,E,&VL,&VU,&IL,&IU,&ABSTOL,&M,W,Z,&LDZ,ISUPPZ,WORK,&LWORK,IWORK,&LIWORK,&INFO);
}
我设法将Nsight的默认编译器更改为icc,并使用 -Xcompiler
直接设置 -mkl
选项 .
在编译时NVCC编译器成功运行,但NVCC链接器失败并显示以下错误消息:
构建目标:cuMatlab调用:NVCC Linker /usr/local/cuda-8.0/bin/nvcc --cudart static -L / usr / local / cuda / lib64 -ccbin / opt / intel / bin / icpc --relocatable-device -code = false -gencode arch = compute_52,code = compute_52 -gencode arch = compute_52,code = sm_52 -link -o“cuMatlab”./ src / cuMatlab.o -lcublas -lcusolver -lcufft -lgomp ./src/cuMatlab . o:在函数trideigs(int,int,double *,double ,double ,double )':/ tmp / tmpxft_000045f8_00000000-13_cuMatlab.ii:85694:undefined reference todstevr'makefile:59:目标'cuMatlab'的配方失败make: [cuMatlab]错误1
我需要添加库路径吗?有任何想法吗?
1 回答
您可以将
nvcc
,icpc
和MKL混合在一起,但至少您必须使用icpc
和nvcc
识别的选项明确链接MKL,例如-L
和-l
. '-mkl'是仅由icpc
识别的选项的捷径 . 您可以参考Intel® Math Kernel Library Link Line Advisor获取选项详细信息 .如果您需要更具体的答案,可以创建一个示例来演示您计划如何编译和链接代码 .
更新
根据您的更新,您已找到NVCC Compiler的
-Xcopmiler
的位置 . 但对于NVCC Linker,您只指定-ccbin
但不指定-Xlinker
. 您将能够在NVCC Linker页面中的类似位置找到-Xlinker
. 这是你应该把-mkl
的地方 . 它会将合适的选项传递给链接器icpc
.