[FFmpeg-devel] [PATCH 2/3] build: add support for building .cu files via nvcc
Philip Langdale
philipl at overt.org
Fri May 12 02:43:18 EEST 2017
On Thu, 11 May 2017 22:59:20 +0200
Timo Rothenpieler <timo at rothenpieler.org> wrote:
> Original work by Yogender Gupta <ygupta at nvidia.com>
> ---
> .gitignore | 2 ++
> Makefile | 2 ++
> compat/cuda/ptx2c.sh | 35 +++++++++++++++++++++++++++++++++++
> configure | 24 +++++++++++++++++++++++-
> ffbuild/common.mak | 15 ++++++++++++---
> 5 files changed, 74 insertions(+), 4 deletions(-)
> create mode 100644 compat/cuda/ptx2c.sh
>
> diff --git a/.gitignore b/.gitignore
> index 96172fea74..dabb51762d 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -19,6 +19,8 @@
> *.swp
> *.ver
> *.version
> +*.ptx
> +*.ptx.c
> *_g
> \#*
> .\#*
> diff --git a/Makefile b/Makefile
> index d414cf841e..4d1c3d768f 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -11,6 +11,8 @@ vpath %.asm $(SRC_PATH)
> vpath %.rc $(SRC_PATH)
> vpath %.v $(SRC_PATH)
> vpath %.texi $(SRC_PATH)
> +vpath %.cu $(SRC_PATH)
> +vpath %.ptx $(SRC_PATH)
> vpath %/fate_config.sh.template $(SRC_PATH)
>
> AVPROGS-$(CONFIG_FFMPEG) += ffmpeg
> diff --git a/compat/cuda/ptx2c.sh b/compat/cuda/ptx2c.sh
> new file mode 100644
> index 0000000000..51f0f57ba7
> --- /dev/null
> +++ b/compat/cuda/ptx2c.sh
> @@ -0,0 +1,35 @@
> +# Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved.
> +#
> +# Permission is hereby granted, free of charge, to any person
> obtaining a +# copy of this software and associated documentation
> files (the "Software"), +# to deal in the Software without
> restriction, including without limitation +# the rights to use, copy,
> modify, merge, publish, distribute, sublicense, +# and/or sell copies
> of the Software, and to permit persons to whom the +# Software is
> furnished to do so, subject to the following conditions: +#
> +# The above copyright notice and this permission notice shall be
> included in +# all copies or substantial portions of the Software.
> +#
> +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND
> NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT
> HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY,
> WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM,
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +#
> DEALINGS IN THE SOFTWARE. +
> +set -e
> +
> +OUT="$1"
> +IN="$2"
> +NAME="$(basename "$IN")"
> +NAME="${NAME/.ptx/}"
> +
> +echo -n "const char ${NAME}_ptx[] = \\" > "$OUT"
> +while read LINE
> +do
> +echo -ne "\n\t\"$LINE\\\n\"" >> "$OUT"
> +done < "$IN"
> +echo ";" >> "$OUT"
> +
> +exit 0
> \ No newline at end of file
> diff --git a/configure b/configure
> index ef2134828b..929256bed7 100755
> --- a/configure
> +++ b/configure
> @@ -338,6 +338,7 @@ Toolchain options:
> --cxx=CXX use C compiler CXX [$cxx_default]
> --objcc=OCC use ObjC compiler OCC [$cc_default]
> --dep-cc=DEPCC use dependency generator DEPCC
> [$cc_default]
> + --nvcc=NVCC use Nvidia CUDA compiler NVCC
> [$nvcc_default] --ld=LD use linker LD [$ld_default]
> --pkg-config=PKGCONFIG use pkg-config tool PKGCONFIG
> [$pkg_config_default] --pkg-config-flags=FLAGS pass additional flags
> to pkgconf [] @@ -359,6 +360,7 @@ Toolchain options:
> --extra-libs=ELIBS add ELIBS [$ELIBS]
> --extra-version=STRING version string suffix []
> --optflags=OPTFLAGS override optimization-related compiler
> flags
> + --nvccflags=NVCCFLAGS override nvcc flags [$nvccflags_default]
> --build-suffix=SUFFIX library name suffix []
> --enable-pic build position-independent code
> --enable-thumb compile for Thumb instruction set
> @@ -2221,6 +2223,7 @@ CMDLINE_SET="
> malloc_prefix
> nm
> optflags
> + nvccflags
> pkg_config
> pkg_config_flags
> progs_suffix
> @@ -2719,6 +2722,7 @@ vaapi_encode_deps="vaapi"
>
> hwupload_cuda_filter_deps="cuda"
> scale_npp_filter_deps="cuda_sdk libnpp"
> +scale_cuda_filter_deps="cuda_sdk"
> nvpp_filter_deps="cuda"
>
> nvenc_deps="cuda"
> @@ -3262,6 +3266,8 @@ strip_default="strip"
> version_script='--version-script'
> yasmexe_default="yasm"
> windres_default="windres"
> +nvcc_default="nvcc"
> +nvccflags_default="-gencode arch=compute_30,code=sm_30 -O2"
>
> # OS
> target_os_default=$(tolower $(uname -s))
> @@ -3335,6 +3341,8 @@ HOSTCC_C='-c'
> HOSTCC_E='-E -o $@'
> HOSTCC_O='-o $@'
> HOSTLD_O='-o $@'
> +NVCC_C='-c'
> +NVCC_O='-o $@'
>
> host_extralibs='-lm'
> host_cflags_filter=echo
> @@ -3722,7 +3730,7 @@
> windres_default="${cross_prefix}${windres_default}"
> sysinclude_default="${sysroot}/usr/include"
> set_default arch cc cxx doxygen pkg_config ranlib strip sysinclude \
> - target_exec target_os yasmexe
> + target_exec target_os yasmexe nvcc
> enabled cross_compile || host_cc_default=$cc
> set_default host_cc
>
> @@ -6242,6 +6250,16 @@ if [ -z "$optflags" ]; then
> fi
> fi
>
> +if [ -z "$nvccflags" ]; then
> + nvccflags=$nvccflags_default
> +fi
> +
> +if enabled x86_64 || enabled ppc64 || enabled aarch64; then
> + nvccflags="$nvccflags -m64"
> +else
> + nvccflags="$nvccflags -m32"
> +fi
> +
> check_optflags(){
> check_cflags "$@"
> enabled lto && check_ldflags "$@"
> @@ -6705,6 +6723,7 @@ ARFLAGS=$arflags
> AR_O=$ar_o
> RANLIB=$ranlib
> STRIP=$strip
> +NVCC=$nvcc
> CP=cp -p
> LN_S=$ln_s
> CPPFLAGS=$CPPFLAGS
> @@ -6712,6 +6731,7 @@ CFLAGS=$CFLAGS
> CXXFLAGS=$CXXFLAGS
> OBJCFLAGS=$OBJCFLAGS
> ASFLAGS=$ASFLAGS
> +NVCCFLAGS=$nvccflags
> AS_C=$AS_C
> AS_O=$AS_O
> OBJCC_C=$OBJCC_C
> @@ -6722,6 +6742,8 @@ CC_E=$CC_E
> CC_O=$CC_O
> CXX_C=$CXX_C
> CXX_O=$CXX_O
> +NVCC_C=$NVCC_C
> +NVCC_O=$NVCC_O
> LD_O=$LD_O
> LD_LIB=$LD_LIB
> LD_PATH=$LD_PATH
> diff --git a/ffbuild/common.mak b/ffbuild/common.mak
> index e61f853ebb..b54bc1db2d 100644
> --- a/ffbuild/common.mak
> +++ b/ffbuild/common.mak
> @@ -15,7 +15,7 @@ ifndef SUBDIR
> ifndef V
> Q = @
> ECHO = printf "$(1)\t%s\n" $(2)
> -BRIEF = CC CXX OBJCC HOSTCC HOSTLD AS YASM AR LD STRIP CP WINDRES
> +BRIEF = CC CXX OBJCC HOSTCC HOSTLD AS YASM AR LD STRIP CP WINDRES
> NVCC SILENT = DEPCC DEPHOSTCC DEPAS DEPYASM RANLIB RM
>
> MSG = $@
> @@ -38,6 +38,7 @@ OBJCCFLAGS = $(CPPFLAGS) $(CFLAGS) $(OBJCFLAGS)
> ASFLAGS := $(CPPFLAGS) $(ASFLAGS)
> CXXFLAGS := $(CPPFLAGS) $(CFLAGS) $(CXXFLAGS)
> YASMFLAGS += $(IFLAGS:%=%/) -Pconfig.asm
> +NVCCFLAGS += -ptx
>
> HOSTCCFLAGS = $(IFLAGS) $(HOSTCPPFLAGS) $(HOSTCFLAGS)
> LDFLAGS := $(ALLFFLIBS:%=$(LD_PATH)lib%) $(LDFLAGS)
> @@ -52,6 +53,7 @@ COMPILE_CXX = $(call COMPILE,CXX)
> COMPILE_S = $(call COMPILE,AS)
> COMPILE_M = $(call COMPILE,OBJCC)
> COMPILE_HOSTC = $(call COMPILE,HOSTCC)
> +COMPILE_NVCC = $(call COMPILE,NVCC)
>
> %.o: %.c
> $(COMPILE_C)
> @@ -89,6 +91,12 @@ COMPILE_HOSTC = $(call COMPILE,HOSTCC)
> %.h.c:
> $(Q)echo '#include "$*.h"' >$@
>
> +%.ptx: %.cu
> + $(COMPILE_NVCC)
> +
> +%.ptx.c: %.ptx
> + $(Q)sh $(SRC_PATH)/compat/cuda/ptx2c.sh $@ $(patsubst
> $(SRC_PATH)/%,$(SRC_LINK)/%,$<) +
> %.c %.h %.pc %.ver %.version: TAG = GEN
>
> # Dummy rule to stop make trying to rebuild removed or renamed
> headers @@ -133,9 +141,10 @@ ALLHEADERS := $(subst
> $(SRC_DIR)/,$(SUBDIR),$(wildcard $(SRC_DIR)/*.h $(SRC_DIR)
> SKIPHEADERS += $(ARCH_HEADERS:%=$(ARCH)/%) $(SKIPHEADERS-)
> SKIPHEADERS := $(SKIPHEADERS:%=$(SUBDIR)%) HOBJS =
> $(filter-out $(SKIPHEADERS:.h=.h.o),$(ALLHEADERS:.h=.h.o))
> +PTXOBJS = $(filter %.ptx.o,$(OBJS)) $(HOBJS): CCFLAGS +=
> $(CFLAGS_HEADERS) checkheaders: $(HOBJS)
> -.SECONDARY: $(HOBJS:.o=.c)
> +.SECONDARY: $(HOBJS:.o=.c) $(PTXOBJS:.o=.c) $(PTXOBJS:.o=)
>
> alltools: $(TOOLS)
>
> @@ -154,7 +163,7 @@ $(TOOLOBJS): | tools
>
> OBJDIRS := $(OBJDIRS) $(dir $(OBJS) $(HOBJS) $(HOSTOBJS) $(SLIBOBJS)
> $(TESTOBJS))
> -CLEANSUFFIXES = *.d *.o *~ *.h.c *.gcda *.gcno *.map *.ver
> *.version *.ho *$(DEFAULT_YASMD).asm +CLEANSUFFIXES = *.d *.o *~
> *.h.c *.gcda *.gcno *.map *.ver *.version *.ho *$(DEFAULT_YASMD).asm
> *.ptx *.ptx.c DISTCLEANSUFFIXES = *.pc LIBSUFFIXES = *.a *.lib
> *.so *.so.* *.dylib *.dll *.def *.dll.a
Looks good.
--phil
More information about the ffmpeg-devel
mailing list