← Back to team overview

dolfin team mailing list archive

Re: Extending DOLFIN CMake scripts for CUDA interoperability

 

Looks like this fixed it!

Now the nvcc compiler complains of not finding dolfin/la/KrylovSolver.h, which 
is a more comprehensible error. You probably need to use some CUDA macro 
together with some of the defined DOLFIN_FOO variables, at least:

  DOLFIN_INCLUDE_DIRECTORIES, DOLFIN_SOURCE_DIR

it looks like nvcc picks up variables set before FindCUDA is called. 

Remember to set:

  -DCMAKE_VERBOSE_MAKEFILE

to get the whole compile statement. It is easier to debug.

Johan


On Tuesday January 18 2011 05:42:04 Johannes Ring wrote:
> On Tue, Jan 18, 2011 at 12:55 PM, Anders Logg <logg@xxxxxxxxx> wrote:
> > On Tue, Jan 18, 2011 at 09:26:06AM +0100, Johannes Ring wrote:
> >> On Mon, Jan 17, 2011 at 10:00 PM, Johan Hake <johan.hake@xxxxxxxxx> 
wrote:
> >> > It looks like changing:
> >> > 
> >> >  add_definitions(-DPACKAGE_VERSION="${DOLFIN_VERSION}")
> >> > 
> >> > to
> >> > 
> >> >  add_definitions(-DPACKAGE_VERSION=${DOLFIN_VERSION})
> >> > 
> >> > Fixed it. PACKAGE_VERSION got added to the defines in the call to nvcc
> >> > and the escaped quotes screwed things up.
> >> > 
> >> > Johannes: Are the quotes needed for something special? It compiles
> >> > alright without the quotes.
> >> 
> >> It does not work for me when I remove the quotes:
> >> 
> >> [ 50%] Building CXX object dolfin/CMakeFiles/dolfin.dir/main/init.cpp.o
> >> /home/johannr/src/bzr/dolfin/dolfin/main/init.cpp:15:53: error: too
> >> many decimal points in number
> >> /home/johannr/src/bzr/dolfin/dolfin/main/init.cpp: In function ‘void
> >> dolfin::dolfin_init(int, char**)’:
> >> /home/johannr/src/bzr/dolfin/dolfin/main/init.cpp:15: error: expected
> >> primary-expression before ‘)’ token
> >> make[2]: *** [dolfin/CMakeFiles/dolfin.dir/main/init.cpp.o] Error 1
> >> make[1]: *** [dolfin/CMakeFiles/dolfin.dir/all] Error 2
> >> make: *** [all] Error 2
> >> 
> >> However, I don't think the -DPACKAGE_VERSION flag is really needed. It
> >> only seems to be used in dolfin/common/constants.h for specifying the
> >> DOLFIN_VERSION. We can use CMake's configure_file command instead to
> >> set this value. How does that sound?
> > 
> > Good.
> 
> Unfortunately, this turned out to be more involved than I thought so I
> went back to use the -DPACKAGE_VERSION flag. However, it seems to work
> better when the flag is added later, that is, after the call to
> find_package(CUDA). I couldn't really test this since my computer
> doesn't have a NVIDIA GPU but at least I managed to get the nvcc
> compiler running. It failed with a message complaining about that the
> file gpu_util.h could not be found. I guess this file comes with the
> NVIDIA drivers or something. Anyway, the DOLFIN development repository
> is now updated with this fix.
> 
> Johannes
> 
> > --
> > Anders
> > 
> >> Johannes
> >> 
> >> > Johan
> >> > 
> >> > On Monday January 17 2011 09:41:26 Johan Hake wrote:
> >> >> Florian!
> >> >> 
> >> >> I am no CMake expert nor have I ever compiled any CUDA code, but it
> >> >> looks like something fishy happens when you add your flags to the
> >> >> CUDA code generation step. Have you set it up correctly? I also get
> >> >> the erronious output from CMake for the nvcc call.
> >> >> 
> >> >> What CMake command is used to set these flags? It almost seems like
> >> >> the eronious flags are set automatic? At least I cannot see that you
> >> >> put PACKAGE_VERSION to the NVCC flags anywhere. If they are
> >> >> automatically set, maybe there is a way to set them using one of the
> >> >> commands from FindCUDA.cmake?
> >> >> 
> >> >> Johan
> >> >> 
> >> >> On Friday January 14 2011 12:07:50 Florian Rathgeber wrote:
> >> >> > Hi,
> >> >> > 
> >> >> > I'm currently trying to get my DOLFIN GPU code in shape but haven't
> >> >> > quite succeeded integrating it with DOLFIN's CMake build.
> >> >> > 
> >> >> > Now the FindCUDA.cmake script tries to propagate host compiler
> >> >> > flags and defines to the NVIDIA compiler nvcc but apparently
> >> >> > messes up so I get a
> >> >> > 
> >> >> > compiler invocation looking like this (only the relevant part):
> >> >> >  -DPACKAGE_VERSION= 0.9.9+\" -Ddolfin_gpu_EXPORTS\" -Xcompiler
> >> >> > 
> >> >> > ,\"-fPIC\",\"-O2\",\"-g\"
> >> >> > 
> >> >> > Note the odd quoting and also the space after -DPACKAGE_VERSION=
> >> >> > 
> >> >> > This causes nvcc to assume this is a target and die:
> >> >> > nvcc fatal   : A single input file is required for a non-link phase
> >> >> > when an outputfile is specified
> >> >> > 
> >> >> > The code is at lp:~florian-rathgeber/dolfin/gpu-backend
> >> >> > 
> >> >> > The relevant section from dolfin/CMakeLists.txt (after all the
> >> >> > other packages)
> >> >> > <<<
> >> >> > # CUDA
> >> >> > SET(DOLFIN_GPU_LIBRARY "")
> >> >> > if (DOLFIN_ENABLE_CUDA AND CUDA_FOUND)
> >> >> > 
> >> >> >   list(APPEND DOLFIN_CXX_DEFINITIONS "-DHAS_CUDA")
> >> >> >   list(APPEND DOLFIN_INCLUDE_DIRECTORIES ${CUDA_INCLUDE_DIRS})
> >> >> >   # Add CUDA sources (*.cu) only if CUDA is enabled
> >> >> >   foreach(DIR ${DOLFIN_DIRS})
> >> >> > 
> >> >> >     file(GLOB _CU_SOURCES ${DIR}/*.cu)
> >> >> >     list(APPEND CU_SOURCES ${_CU_SOURCES})
> >> >> > 
> >> >> >   endforeach()
> >> >> >   CUDA_ADD_LIBRARY(dolfin_gpu ${CU_SOURCES} SHARED)
> >> >> >   SET(DOLFIN_GPU_LIBRARY dolfin_gpu)
> >> >> >   list(APPEND DOLFIN_TARGET_LINK_LIBRARIES ${CUDA_LIBRARIES}
> >> >> > 
> >> >> > ${DOLFIN_GPU_LIBRARY})
> >> >> > endif()
> >> >> > 
> >> >> > # Cusp
> >> >> > if (DOLFIN_ENABLE_CUSP AND CUSP_FOUND)
> >> >> > 
> >> >> >   list(APPEND DOLFIN_CXX_DEFINITIONS "-DHAS_CUSP")
> >> >> >   list(APPEND DOLFIN_INCLUDE_DIRECTORIES ${THRUST_INCLUDE_DIRS}
> >> >> > 
> >> >> >     ${CUSP_INCLUDE_DIRS})
> >> >> > 
> >> >> > endif()
> >> >> > <<<
> >> >> > 
> >> >> > In CMakeLists.txt I check for the packages like this:
> >> >> > <<<
> >> >> > # Check for CUDA
> >> >> > if (DOLFIN_ENABLE_CUDA)
> >> >> > 
> >> >> >   find_package(CUDA)
> >> >> > 
> >> >> > endif()
> >> >> > 
> >> >> > # Check for Cusp
> >> >> > if (DOLFIN_ENABLE_CUSP)
> >> >> > 
> >> >> >   find_package(Cusp)
> >> >> > 
> >> >> > endif()
> >> >> > <<<
> >> >> > FindCUDA is the stock script from CMake 2.8, FindCusp is a simple
> >> >> > script I wrote which lives in cmake/modules
> >> >> > 
> >> >> > I'd be happy about any hints and tips. Garth, afair you wanted to
> >> >> > look into this at some point now that the new build system is in
> >> >> > place?
> >> >> > 
> >> >> > Florian
> >> >> 
> >> >> _______________________________________________
> >> >> Mailing list: https://launchpad.net/~dolfin
> >> >> Post to     : dolfin@xxxxxxxxxxxxxxxxxxx
> >> >> Unsubscribe : https://launchpad.net/~dolfin
> >> >> More help   : https://help.launchpad.net/ListHelp
> >> > 
> >> > _______________________________________________
> >> > Mailing list: https://launchpad.net/~dolfin
> >> > Post to     : dolfin@xxxxxxxxxxxxxxxxxxx
> >> > Unsubscribe : https://launchpad.net/~dolfin
> >> > More help   : https://help.launchpad.net/ListHelp
> >> 
> >> _______________________________________________
> >> Mailing list: https://launchpad.net/~dolfin
> >> Post to     : dolfin@xxxxxxxxxxxxxxxxxxx
> >> Unsubscribe : https://launchpad.net/~dolfin
> >> More help   : https://help.launchpad.net/ListHelp



References