Fortran 未解析符号向量添加_

Fortran 未解析符号向量添加_,fortran,openmp,gfortran,Fortran,Openmp,Gfortran,首先,我的源程序如下所示: 打电话给fun.f90 program call_fun use omp_lib implicit none integer, parameter :: N = 100 integer a(N), b(N), c(N) integer i do i = 1, N a(i) = i b(i) = i+1 end do !$omp target !$omp parallel do do i = 1, N call vec_add(a

首先,我的源程序如下所示:

打电话给fun.f90

program call_fun
use omp_lib
implicit none

integer, parameter :: N = 100
integer a(N), b(N), c(N)
integer i

do i = 1, N
    a(i) = i
    b(i) = i+1
end do

!$omp target
!$omp parallel do
do i = 1, N     
    call vec_add(a(i), b(i), c(i))
end do
!$omp end target

write(*,10) N, c(N)
10 format('c[', I4, ']=', I6)
end program
subroutine vec_add(a, b, c)
implicit none

integer a, b, c

c = a + b
end
vec_add.f90

program call_fun
use omp_lib
implicit none

integer, parameter :: N = 100
integer a(N), b(N), c(N)
integer i

do i = 1, N
    a(i) = i
    b(i) = i+1
end do

!$omp target
!$omp parallel do
do i = 1, N     
    call vec_add(a(i), b(i), c(i))
end do
!$omp end target

write(*,10) N, c(N)
10 format('c[', I4, ']=', I6)
end program
subroutine vec_add(a, b, c)
implicit none

integer a, b, c

c = a + b
end
显然,这两个程序很简单,我只是为了测试。然后,我使用以下命令编译和链接程序:

gfortran -fopenmp -foffload=nvptx-none -c vec_add.f90 call_fun.f90
gfortran -fopenmp -foffload=nvptx-none call_fun.o vec_add.o -o call.x
最后,我收到了以下错误报告:

unresolved symbol vec_add_
collect2: 错误:ld 返回 1
mkoffload: fatal error: x86_64-pc-linux-gnu-accel-nvptx-none-gcc returned 1 
exit status
compilation terminated.
lto-wrapper: 致命错误:/home/gjh/software/offload/install/libexec/gcc/x86_64- 
pc-linux-gnu/9.0.0//accel/nvptx-none/mkoffload 以返回值 1 退出
编译中断。
/usr/bin/x86_64-linux-gnu-ld: error: lto-wrapper failed
collect2: 错误:ld 返回 1
链接器似乎找不到vec_add_,但我不知道如何修复它。我的GCC版本是9.0.0(20180605),相应的OpenMP版本是4.5。我不知道它是否不支持任务构造中的函数调用,或者其他原因。有没有人遇到过这样的问题

更详细地说,我使用以下脚本来配置环境:

#!/bin/sh

#
# Build GCC with support for offloading to NVIDIA GPUs
#

work_dir=$HOME/software/offload
install_dir=$work_dir/install

# Location of the installed CUDA toolkit
cuda=/usr/local/cuda

# Build assembler and linking tools
cd $work_dir
git clone https://github.com/MentorEmbedded/nvptx-tools
cd nvptx-tools
./configure \
    --with-cuda-driver-include=$cuda/include \
    --with-cuda-driver-lib=$cuda/lib64 \
    --enable-languages="c,c++,fortran,lto" \
    --prefix=$install_dir
make clean
make
make install
cd ../

# Set up the GCC source tree
git clone https://github.com/MentorEmbedded/nvptx-newlib
svn co svn://gcc.gnu.org/svn/gcc/trunk gcc
cd gcc
contrib/download_prerequistes
ln -s ../nvptx-newlib/newlib newlib
cd ..
target=$(gcc/config.guess)

# Build nvptx GCC
mkdir build-nvptx-gcc
cd build-nvptx-gcc
../gcc/configure \
     --target=nvptx-none --with-build-time-tools=$install_dir/nvptx-none/bin \
     --enable-as-accelerator-for=$target \
     --disable-sjlj-exceptions \
     --enable-newlib-io-long-long \
     --enable-languages="c,c++,fortran,lto" \
     --prefix=$install_dir
make clean
make -j4
make install
cd ..

# Build host GCC
mkdir build-host-gcc
cd build-host-gcc
../gcc/configure \
    --enable-offload-targets=nvptx-none \
    --with-cuda-driver-include=$cuda/include \
    --with-cuda-driver-lib=$cuda/lib64 \
    --disable-bootstrap \
    --disable-multilib \
    --enable-languages="c,c++,fortran,lto" \
    --prefix=$install_dir
make clean
make -j4
make install
cd ..
这个脚本是其他人写的,我引用了它。此外,我设置环境变量如下

export LD_LIBRARY_PATH=/usr/local/cuda-9.2/lib64:/home/gjh/software/offload/install/lib64:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda-9.2/bin:/home/gjh/software/offload/install/bin:$PATH

我从您的命令中删除了
-fopenmp-foffload=nvptx none
,并使用
-o call_test.exe
(在windows 7上)生成了一个运行版本,所有操作正常。我建议你确认一下,然后介绍
-fopenmp
(没有目标),然后介绍
target
是的,我也是。但是,如果我不使用“-fopenmp-foffload=nvptx none”选项,生成的运行程序“call_test.exe”将只在CPU中执行,并且只在一个内核中执行。虽然我的初衷是通过“-fopenmp-foffload=nvptx none”在GPU上执行程序并使用多线程,但错误消息指向自定义构建或手动二进制下载GCC。你是如何安装GCC的?您的环境(变量
PATH
LD\u LIBRARY\u PATH
等)是否已为该编译器正确设置?我刚刚更具体地编辑了我的问题,包括添加我的安装方式和环境配置。谢谢你的回复。