Rework cuda example
parent
4ee170f0ec
commit
3972f27eb5
@ -1,40 +0,0 @@
|
|||||||
AMGDIR=../..
|
|
||||||
AMGINCDIR=$(AMGDIR)/include
|
|
||||||
include $(AMGINCDIR)/Make.inc.amg4psblas
|
|
||||||
AMGMODDIR=$(AMGDIR)/modules
|
|
||||||
AMGLIBDIR=$(AMGDIR)/lib
|
|
||||||
AMG_LIBS=-L$(AMGLIBDIR) -lpsb_krylov -lamg_prec -lpsb_prec
|
|
||||||
# To compile these example you need to have also installed PSBLAS-EXT, SPGPU and
|
|
||||||
# CUDA. Please refer to the documentation of AMG4PSBLAS and PSBLAX-EXT for the
|
|
||||||
# full details.
|
|
||||||
# This define the variables : PSBGPULDLIBS, LIBRSB_INCLUDES, and CUDA_INCLUDES
|
|
||||||
PSBEXT_DIR= #< FILL-ME >
|
|
||||||
include $(PSBEXT_DIR)/include/Make.inc.ext
|
|
||||||
|
|
||||||
FINCLUDES=$(FMFLAG). $(FMFLAG)$(AMGMODDIR) $(FMFLAG)$(AMGINCDIR) \
|
|
||||||
$(PSBLAS_INCLUDES) $(FIFLAG). $(FMFLAG)$(SPGPU_INCDIR) \
|
|
||||||
$(FMFLAG)$(LIBRSB_INCLUDES) $(FMFLAG)$(CUDA_INCLUDES) \
|
|
||||||
|
|
||||||
LINKOPT=$(CINCLUDES) $(CDEFINES) $(CUDEFINES)
|
|
||||||
|
|
||||||
DGOBJS=amg_dexample_gpu.o data_input.o amg_dpde_mod.o
|
|
||||||
|
|
||||||
EXEDIR=./runs
|
|
||||||
|
|
||||||
all: amg_dexample_gpu
|
|
||||||
|
|
||||||
|
|
||||||
amg_dexample_gpu: $(DGOBJS)
|
|
||||||
$(FLINK) $(LINKOPT) $(DGOBJS) -o amg_dexample_gpu \
|
|
||||||
$(AMG_LIBS) $(PSBLAS_LIBS) $(PSBGPULDLIBS) $(LDLIBS)
|
|
||||||
/bin/mv amg_dexample_gpu $(EXEDIR)
|
|
||||||
|
|
||||||
amg_dexample_gpu.o: data_input.o amg_dpde_mod.o
|
|
||||||
|
|
||||||
clean:
|
|
||||||
/bin/rm -f $(DGOBJS) *$(.mod) $(EXEDIR)/amg_dexample_gpu
|
|
||||||
|
|
||||||
lib:
|
|
||||||
(cd ../../; make library)
|
|
||||||
verycleanlib:
|
|
||||||
(cd ../../; make veryclean)
|
|
||||||
@ -1,352 +0,0 @@
|
|||||||
!
|
|
||||||
!
|
|
||||||
! AMG4PSBLAS version 1.0
|
|
||||||
! Algebraic Multigrid Package
|
|
||||||
! based on PSBLAS (Parallel Sparse BLAS version 3.7)
|
|
||||||
!
|
|
||||||
! (C) Copyright 2021
|
|
||||||
!
|
|
||||||
! Salvatore Filippone
|
|
||||||
! Pasqua D'Ambra
|
|
||||||
! Fabio Durastante
|
|
||||||
!
|
|
||||||
! Redistribution and use in source and binary forms, with or without
|
|
||||||
! modification, are permitted provided that the following conditions
|
|
||||||
! are met:
|
|
||||||
! 1. Redistributions of source code must retain the above copyright
|
|
||||||
! notice, this list of conditions and the following disclaimer.
|
|
||||||
! 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
! notice, this list of conditions, and the following disclaimer in the
|
|
||||||
! documentation and/or other materials provided with the distribution.
|
|
||||||
! 3. The name of the AMG4PSBLAS group or the names of its contributors may
|
|
||||||
! not be used to endorse or promote products derived from this
|
|
||||||
! software without specific written permission.
|
|
||||||
!
|
|
||||||
! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
|
||||||
! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AMG4PSBLAS GROUP OR ITS CONTRIBUTORS
|
|
||||||
! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
! POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
!
|
|
||||||
!
|
|
||||||
! File: amg_dexample_gpu.f90
|
|
||||||
!
|
|
||||||
! This sample program solves a linear system obtained by discretizing a
|
|
||||||
! PDE with Dirichlet BCs. The solver is CG, coupled with one of the
|
|
||||||
! following multi-level preconditioner, as explained in Section 4.2 of
|
|
||||||
! the AMG4PSBLAS User's and Reference Guide:
|
|
||||||
!
|
|
||||||
! - choice = 1, a V-cycle with decoupled smoothed aggregation, 4 Jacobi
|
|
||||||
! sweeps as pre/post-smoother and 8 Jacobi sweeps as coarsest-level
|
|
||||||
! solver with replicated coarsest matrix
|
|
||||||
!
|
|
||||||
! - choice = 2, a W-cycle based on the coupled aggregation relying on matching,
|
|
||||||
! with maximum size of aggregates equal to 8 and smoothed prolongators,
|
|
||||||
! 2 sweeps of Block-Jacobi ipre/post-smoother using approximate inverse INVK and
|
|
||||||
! 4 sweeps of Block-Jacobi with INVK as coarsest-level solver on distributed
|
|
||||||
! coarsest matrix
|
|
||||||
!
|
|
||||||
! The matrix and the rhs are read from files (if an rhs is not available, the
|
|
||||||
! unit rhs is set).
|
|
||||||
!
|
|
||||||
!
|
|
||||||
! The PDE is a general second order equation in 3d
|
|
||||||
!
|
|
||||||
! a1 dd(u) a2 dd(u) a3 dd(u) b1 d(u) b2 d(u) b3 d(u)
|
|
||||||
! - ------ - ------ - ------ + ----- + ------ + ------ + c u = f
|
|
||||||
! dxdx dydy dzdz dx dy dz
|
|
||||||
!
|
|
||||||
! with Dirichlet boundary conditions
|
|
||||||
! u = g
|
|
||||||
!
|
|
||||||
! on the unit cube 0<=x,y,z<=1.
|
|
||||||
!
|
|
||||||
!
|
|
||||||
! Note that if b1=b2=b3=c=0., the PDE is the Laplace equation.
|
|
||||||
!
|
|
||||||
! In this sample program the index space of the discretized
|
|
||||||
! computational domain is first numbered sequentially in a standard way,
|
|
||||||
! then the corresponding vector is distributed according to a BLOCK
|
|
||||||
! data distribution.
|
|
||||||
!
|
|
||||||
program amg_dexample_gpu
|
|
||||||
use psb_base_mod
|
|
||||||
use amg_prec_mod
|
|
||||||
use psb_krylov_mod
|
|
||||||
use psb_util_mod
|
|
||||||
use psb_gpu_mod
|
|
||||||
use data_input
|
|
||||||
use amg_d_pde_mod
|
|
||||||
implicit none
|
|
||||||
|
|
||||||
! input parameters
|
|
||||||
|
|
||||||
! sparse matrices
|
|
||||||
type(psb_dspmat_type) :: A
|
|
||||||
|
|
||||||
! sparse matrices descriptor
|
|
||||||
type(psb_desc_type):: desc_A
|
|
||||||
|
|
||||||
! preconditioner
|
|
||||||
type(amg_dprec_type) :: P
|
|
||||||
|
|
||||||
! right-hand side, solution and residual vectors
|
|
||||||
type(psb_d_vect_type) :: x, b, r
|
|
||||||
! GPU variables
|
|
||||||
type(psb_d_hlg_sparse_mat) :: agmold
|
|
||||||
type(psb_d_vect_gpu) :: vgmold
|
|
||||||
type(psb_i_vect_gpu) :: igmold
|
|
||||||
|
|
||||||
! solver and preconditioner parameters
|
|
||||||
real(psb_dpk_) :: tol, err
|
|
||||||
integer :: itmax, iter, istop
|
|
||||||
integer :: nlev
|
|
||||||
|
|
||||||
! parallel environment parameters
|
|
||||||
type(psb_ctxt_type) :: ctxt
|
|
||||||
integer :: iam, np
|
|
||||||
|
|
||||||
! other variables
|
|
||||||
integer :: choice
|
|
||||||
integer :: i,info,j
|
|
||||||
integer(psb_epk_) :: amatsize, precsize, descsize
|
|
||||||
integer(psb_epk_) :: system_size
|
|
||||||
integer :: idim, ierr, ircode
|
|
||||||
real(psb_dpk_) :: resmx, resmxp
|
|
||||||
real(psb_dpk_) :: t1, t2, tprec
|
|
||||||
character(len=5) :: afmt='CSR'
|
|
||||||
character(len=20) :: name, kmethod
|
|
||||||
|
|
||||||
! initialize the parallel environment
|
|
||||||
|
|
||||||
call psb_init(ctxt)
|
|
||||||
call psb_info(ctxt,iam,np)
|
|
||||||
!
|
|
||||||
! BEWARE: if you have NGPUS per node, the default is to
|
|
||||||
! attach to mod(IAM,NGPUS)
|
|
||||||
!
|
|
||||||
call psb_gpu_init(ictxt)
|
|
||||||
|
|
||||||
if (iam < 0) then
|
|
||||||
! This should not happen, but just in case
|
|
||||||
call psb_exit(ctxt)
|
|
||||||
stop
|
|
||||||
endif
|
|
||||||
|
|
||||||
name='amg_dexample_gpu'
|
|
||||||
if(psb_get_errstatus() /= 0) goto 9999
|
|
||||||
info=psb_success_
|
|
||||||
call psb_set_errverbosity(2)
|
|
||||||
!
|
|
||||||
! Hello world
|
|
||||||
!
|
|
||||||
if (iam == psb_root_) then
|
|
||||||
write(*,*) 'Welcome to AMG4PSBLAS version: ',amg_version_string_
|
|
||||||
write(*,*) 'This is the ',trim(name),' sample program'
|
|
||||||
end if
|
|
||||||
write(*,*) 'Process ',iam,' running on device: ', psb_cuda_getDevice(),' out of', psb_cuda_getDeviceCount()
|
|
||||||
write(*,*) 'Process ',iam,' device ', psb_cuda_getDevice(),' is a: ', trim(psb_gpu_DeviceName())
|
|
||||||
|
|
||||||
! get parameters
|
|
||||||
|
|
||||||
call get_parms(ctxt,choice,idim,itmax,tol)
|
|
||||||
|
|
||||||
! allocate and fill in the coefficient matrix, rhs and initial guess
|
|
||||||
|
|
||||||
call psb_barrier(ctxt)
|
|
||||||
t1 = psb_wtime()
|
|
||||||
call amg_gen_pde3d(ctxt,idim,a,b,x,desc_a,afmt,&
|
|
||||||
& a1,a2,a3,b1,b2,b3,c,g,info)
|
|
||||||
call psb_barrier(ctxt)
|
|
||||||
t2 = psb_wtime() - t1
|
|
||||||
if(info /= psb_success_) then
|
|
||||||
info=psb_err_from_subroutine_
|
|
||||||
call psb_errpush(info,name)
|
|
||||||
goto 9999
|
|
||||||
end if
|
|
||||||
|
|
||||||
if (iam == psb_root_) write(*,'("Overall matrix creation time : ",es12.5)')t2
|
|
||||||
if (iam == psb_root_) write(*,'(" ")')
|
|
||||||
|
|
||||||
select case(choice)
|
|
||||||
|
|
||||||
case(1)
|
|
||||||
|
|
||||||
! initialize a V-cycle preconditioner, relying on decoupled smoothed aggregation
|
|
||||||
! with 4 Jacobi sweeps as pre/post-smoother
|
|
||||||
! and 8 Jacobi sweeps as coarsest-level solver on replicated coarsest matrix
|
|
||||||
|
|
||||||
call P%init(ctxt,'ML',info)
|
|
||||||
call P%set('SMOOTHER_TYPE','JACOBI',info)
|
|
||||||
call P%set('SMOOTHER_SWEEPS',4,info)
|
|
||||||
call P%set('COARSE_SOLVE','JACOBI',info)
|
|
||||||
call P%set('COARSE_SWEEPS',8,info)
|
|
||||||
kmethod = 'CG'
|
|
||||||
|
|
||||||
case(2)
|
|
||||||
|
|
||||||
! initialize a W-cycle preconditioner based on the coupled aggregation relying on matching,
|
|
||||||
! with maximum size of aggregates equal to 8 and smoothed prolongators,
|
|
||||||
! 2 sweeps of Block-Jacobi pre/post-smoother using approximate inverse INVK and
|
|
||||||
! 4 sweeps of Block-Jacobi with INVK on the coarsest level distributed matrix
|
|
||||||
|
|
||||||
call P%init(ctxt,'ML',info)
|
|
||||||
call P%set('PAR_AGGR_ALG','COUPLED',info)
|
|
||||||
call P%set('AGGR_TYPE','MATCHBOXP',info)
|
|
||||||
call P%set('AGGR_SIZE',8,info)
|
|
||||||
call P%set('ML_CYCLE','WCYCLE',info)
|
|
||||||
call P%set('SMOOTHER_TYPE','BJAC',info)
|
|
||||||
call P%set('SMOOTHER_SWEEPS',2,info)
|
|
||||||
call P%set('SUB_SOLVE','INVK',info)
|
|
||||||
call P%set('COARSE_SOLVE','BJAC',info)
|
|
||||||
call P%set('COARSE_SUBSOLVE','INVK',info)
|
|
||||||
call P%set('COARSE_SWEEPS',4,info)
|
|
||||||
call P%set('COARSE_MAT','DIST',info)
|
|
||||||
kmethod = 'CG'
|
|
||||||
|
|
||||||
end select
|
|
||||||
|
|
||||||
call psb_barrier(ctxt)
|
|
||||||
t1 = psb_wtime()
|
|
||||||
|
|
||||||
! build the preconditioner
|
|
||||||
call P%hierarchy_build(A,desc_A,info)
|
|
||||||
call P%smoothers_build(A,desc_A,info, amold=agmold, vmold=vgmold, imold=igmold)
|
|
||||||
|
|
||||||
tprec = psb_wtime()-t1
|
|
||||||
call psb_amx(ctxt, tprec)
|
|
||||||
|
|
||||||
if (info /= psb_success_) then
|
|
||||||
call psb_errpush(psb_err_from_subroutine_,name,a_err='amg_precbld')
|
|
||||||
goto 9999
|
|
||||||
end if
|
|
||||||
|
|
||||||
! set the solver parameters and the initial guess
|
|
||||||
|
|
||||||
call psb_geall(x,desc_A,info)
|
|
||||||
call x%zero()
|
|
||||||
call psb_geasb(x,desc_A,info)
|
|
||||||
|
|
||||||
! Convert A, DESC_A,X,B to a GPU-enabled format
|
|
||||||
call desc_a%cnv(mold=igmold)
|
|
||||||
call a%cscnv(info,mold=agmold)
|
|
||||||
call psb_geasb(x,desc_a,info,mold=vgmold)
|
|
||||||
call psb_geasb(b,desc_a,info,mold=vgmold)
|
|
||||||
|
|
||||||
|
|
||||||
! solve Ax=b with preconditioned Krylov method
|
|
||||||
|
|
||||||
call psb_barrier(ctxt)
|
|
||||||
call prec%allocate_wrk(info)
|
|
||||||
t1 = psb_wtime()
|
|
||||||
|
|
||||||
call psb_krylov(kmethod,A,P,b,x,tol,desc_A,info,itmax,iter,err,itrace=1,istop=2)
|
|
||||||
|
|
||||||
t2 = psb_wtime() - t1
|
|
||||||
call psb_amx(ctxt,t2)
|
|
||||||
call prec%deallocate_wrk(info)
|
|
||||||
|
|
||||||
call psb_geall(r,desc_A,info)
|
|
||||||
call r%zero()
|
|
||||||
call psb_geasb(r,desc_A,info)
|
|
||||||
call psb_geaxpby(done,b,dzero,r,desc_A,info)
|
|
||||||
call psb_spmm(-done,A,x,done,r,desc_A,info)
|
|
||||||
resmx = psb_genrm2(r,desc_A,info)
|
|
||||||
resmxp = psb_geamax(r,desc_A,info)
|
|
||||||
|
|
||||||
amatsize = a%sizeof()
|
|
||||||
descsize = desc_a%sizeof()
|
|
||||||
precsize = p%sizeof()
|
|
||||||
system_size = desc_a%get_global_rows()
|
|
||||||
call psb_sum(ctxt,amatsize)
|
|
||||||
call psb_sum(ctxt,descsize)
|
|
||||||
call psb_sum(ctxt,precsize)
|
|
||||||
|
|
||||||
call P%descr(info)
|
|
||||||
|
|
||||||
if (iam == psb_root_) then
|
|
||||||
write(*,'(" ")')
|
|
||||||
write(*,'("Matrix from PDE example")')
|
|
||||||
write(*,'("Computed solution on ",i8," processors")')np
|
|
||||||
write(*,'("Linear system size : ",i12)') system_size
|
|
||||||
write(*,'("Krylov method : ",a)') kmethod
|
|
||||||
write(*,'("Iterations to convergence : ",i6)')iter
|
|
||||||
write(*,'("Error estimate on exit : ",es12.5)')err
|
|
||||||
write(*,'("Time to build prec. : ",es12.5)')tprec
|
|
||||||
write(*,'("Time to solve system : ",es12.5)')t2
|
|
||||||
write(*,'("Time per iteration : ",es12.5)')t2/(iter)
|
|
||||||
write(*,'("Total time : ",es12.5)')t2+tprec
|
|
||||||
write(*,'("Residual 2-norm : ",es12.5)')resmx
|
|
||||||
write(*,'("Residual inf-norm : ",es12.5)')resmxp
|
|
||||||
write(*,'("Total memory occupation for A : ",i12)')amatsize
|
|
||||||
write(*,'("Total memory occupation for DESC_A : ",i12)')descsize
|
|
||||||
write(*,'("Total memory occupation for PREC : ",i12)')precsize
|
|
||||||
end if
|
|
||||||
|
|
||||||
call psb_gefree(b, desc_A,info)
|
|
||||||
call psb_gefree(x, desc_A,info)
|
|
||||||
call psb_spfree(A, desc_A,info)
|
|
||||||
call P%free(info)
|
|
||||||
call psb_cdfree(desc_A,info)
|
|
||||||
call psb_gpu_exit()
|
|
||||||
call psb_exit(ctxt)
|
|
||||||
stop
|
|
||||||
|
|
||||||
9999 continue
|
|
||||||
call psb_error(ctxt)
|
|
||||||
|
|
||||||
contains
|
|
||||||
!
|
|
||||||
! get parameters from standard input
|
|
||||||
!
|
|
||||||
subroutine get_parms(ctxt,choice,idim,itmax,tol)
|
|
||||||
|
|
||||||
implicit none
|
|
||||||
|
|
||||||
type(psb_ctxt_type) :: ctxt
|
|
||||||
integer :: choice, idim, itmax
|
|
||||||
real(psb_dpk_) :: tol
|
|
||||||
integer :: iam, np, inp_unit
|
|
||||||
character(len=1024) :: filename
|
|
||||||
|
|
||||||
call psb_info(ctxt,iam,np)
|
|
||||||
|
|
||||||
if (iam == psb_root_) then
|
|
||||||
if (command_argument_count()>0) then
|
|
||||||
call get_command_argument(1,filename)
|
|
||||||
inp_unit = 30
|
|
||||||
open(inp_unit,file=filename,action='read',iostat=info)
|
|
||||||
if (info /= 0) then
|
|
||||||
write(psb_err_unit,*) 'Could not open file ',filename,' for input'
|
|
||||||
call psb_abort(ctxt)
|
|
||||||
stop
|
|
||||||
else
|
|
||||||
write(psb_err_unit,*) 'Opened file ',trim(filename),' for input'
|
|
||||||
end if
|
|
||||||
else
|
|
||||||
inp_unit=psb_inp_unit
|
|
||||||
end if
|
|
||||||
! read input parameters
|
|
||||||
call read_data(choice,inp_unit)
|
|
||||||
call read_data(idim,inp_unit)
|
|
||||||
call read_data(itmax,inp_unit)
|
|
||||||
call read_data(tol,inp_unit)
|
|
||||||
if (inp_unit /= psb_inp_unit) then
|
|
||||||
close(inp_unit)
|
|
||||||
end if
|
|
||||||
end if
|
|
||||||
|
|
||||||
call psb_bcast(ctxt,choice)
|
|
||||||
call psb_bcast(ctxt,idim)
|
|
||||||
call psb_bcast(ctxt,itmax)
|
|
||||||
call psb_bcast(ctxt,tol)
|
|
||||||
|
|
||||||
end subroutine get_parms
|
|
||||||
|
|
||||||
end program amg_dexample_gpu
|
|
||||||
@ -0,0 +1,43 @@
|
|||||||
|
AMGDIR=../..
|
||||||
|
AMGINCDIR=$(AMGDIR)/include
|
||||||
|
include $(AMGINCDIR)/Make.inc.amg4psblas
|
||||||
|
AMGMODDIR=$(AMGDIR)/modules
|
||||||
|
AMGLIBDIR=$(AMGDIR)/lib
|
||||||
|
AMG_LIBS=-L$(AMGLIBDIR) -lpsb_krylov -lamg_prec -lpsb_prec
|
||||||
|
# To compile these example you need to have also installed PSBLAS-EXT, SPGPU and
|
||||||
|
# CUDA. Please refer to the documentation of AMG4PSBLAS and PSBLAX-EXT for the
|
||||||
|
# full details.
|
||||||
|
# This define the variables : PSBGPULDLIBS, LIBRSB_INCLUDES, and CUDA_INCLUDES
|
||||||
|
#PSBEXT_DIR= #< FILL-ME >
|
||||||
|
#include $(PSBEXT_DIR)/include/Make.inc.ext
|
||||||
|
include $(PSBLASDIR)/include/Make.inc.psblas
|
||||||
|
PSBLIBDIR=$(PSBLASDIR)/lib/
|
||||||
|
FINCLUDES=$(FMFLAG). $(FMFLAG)$(AMGMODDIR) $(FMFLAG)$(AMGINCDIR) \
|
||||||
|
$(PSBLAS_INCLUDES) $(FIFLAG).
|
||||||
|
AMG_LIB=-L$(AMGLIBDIR) -lamg_prec
|
||||||
|
PSBLAS_LIB= -L$(PSBLIBDIR) -lpsb_linsolve -lpsb_prec -lpsb_util -lpsb_ext \
|
||||||
|
-lpsb_base
|
||||||
|
|
||||||
|
LINKOPT=-lstdc++
|
||||||
|
|
||||||
|
DGOBJS=amg_dexample_cuda.o data_input.o
|
||||||
|
|
||||||
|
EXEDIR=./runs
|
||||||
|
|
||||||
|
all: amg_dexample_cuda
|
||||||
|
|
||||||
|
|
||||||
|
amg_dexample_cuda: $(DGOBJS)
|
||||||
|
$(FLINK) $(LINKOPT) $(DGOBJS) -o amg_dexample_cuda \
|
||||||
|
$(AMG_LIB) $(PSBGPULDLIBS) $(PSBLAS_LIB) $(LDLIBS)
|
||||||
|
/bin/mv amg_dexample_cuda $(EXEDIR)
|
||||||
|
|
||||||
|
amg_dexample_cuda.o: data_input.o
|
||||||
|
|
||||||
|
clean:
|
||||||
|
/bin/rm -f $(DGOBJS) *$(.mod) $(EXEDIR)/amg_dexample_cuda
|
||||||
|
|
||||||
|
lib:
|
||||||
|
(cd ../../; make library)
|
||||||
|
verycleanlib:
|
||||||
|
(cd ../../; make veryclean)
|
||||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue