我正在尝试编译我的OpenACC并行c++程序,该程序使用dgemm (BLAS)和dgesvd (LAPACK)函数。
我正在尝试用PGI PGCC编译器编译程序,将其与这样的库链接(该程序称为"VD"):
# Target rules
LIBRARIES := -lblas -llapack -lm
CC = gcc
CFLAGS = -O3
PGCC = pgcc -Minfo=accel -fast -acc -ta=multicore -tp=nehalem -DDEBUG
################################################################################
# Target rules
all: build
build: vd
VD.o: VD.cpp
$(PGCC) -o $@ -c $< -w
vd: VD.o
$(PGCC) $(CFLAGS) -o $@ $+ $(LIBRARIES)
clean:
rm -f VD.o vd
但我得到以下错误:https://i.stack.imgur.com/giIlr.jpg
看起来文件正在编译(我的意思是代码中没有错误),但是当它要链接到LAPACK (BLAS工作)时,它似乎没有找到一些引用。
我的$(LD_LIBRARY_PATH)
变量包含LAPACK的确切路径:/opt/nvidia/hpc_sdk/Linux_x86_64/21.9/compilers/lib/
这是我的代码的第一部分:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <time.h>
#include <string.h>
// NUEVOS INCLUDES
#include <openacc.h>
// FIN DE NUEVOS INCLUDES
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#define MAXLINE 200
#define MAXCAD 200
#define FPS 5
extern int dgemm_(char *transa, char *transb, int *m, int *
n, int *k, double *alpha, double *a, int *lda,
double *b, int *ldb, double *beta, double *c, int
*ldc);
extern int dgesvd_(char *jobu, char *jobvt, int *m, int *n,
double *a, int *lda, double *s, double *u, int *
ldu, double *vt, int *ldvt, double *work, int *lwork,
int *info);
注意:我试着把这些最新的函数以"extern "C"开头。int……"但是它不能编译。
我错过了什么?
谢谢!
BLAS和LAPACK是用Fortran编写的,因此您看到的错误是由于链接行上缺少Fortran运行时库。
要修复,请在链接行添加" -fortranlibs ",以便添加这些库。