我想在我的一个头文件中实现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,并使用-mkl
直接设置-Xcompiler
选项。
在编译时,NVCC编译器成功运行,但NVCC Linker失败并显示以下错误消息:
构建目标: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 to
dstevr'中 makefile:59:目标'cuMatlab'的配方失败了 make:*** [cuMatlab]错误1
我是否需要添加库路径?有什么想法吗?
答案 0 :(得分:1)
您可以将nvcc
,icpc
和MKL混合在一起,但至少您必须明确地将MKL与icpc
和nvcc
识别的选项相关联,例如-L
和-l
。 '-mkl'是仅icpc
识别的选项的捷径。您可以参考Intel® Math Kernel Library Link Line Advisor了解选项详情。
如果您需要更具体的答案,可以创建一个示例来演示您计划如何编译和链接代码。
根据您的更新,您已找到NVCC编译器-Xcopmiler
的位置。但是对于NVCC Linker,您只指定了-ccbin
而不是-Xlinker
。您可以在NVCC Linker页面中的类似位置找到-Xlinker
。这是你应该放置-mkl
的地方。它会将合适的选项传递给链接器icpc
。