Quantcast

Problems building a MODULE library (OpenFX plugin) with correct cuda object linking

classic Classic list List threaded Threaded
4 messages Options
dev
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Problems building a MODULE library (OpenFX plugin) with correct cuda object linking

dev
Hello,

after hours and hours of searching and trying to get it to work I hope
someone here can help me as I'm now out of ideas. I'm trying to build an
OpenFX plugin for DaVinci Resolve (a movie color grading software,
https://www.blackmagicdesign.com/products) via CMake. Resolve is
delivered with a developer sample plugin using a standard Makefile (Mac)
and project files for Apple XCode/VisualStudio. But for a better
structure I wanted to build a CMake build framework for this plugin.

Notes for better understanding: The CUDA implementation is a proprietary
Add On to the OpenSource OpenFX interfaces as far as I understand it.
Stock OpenFX would pass memory references only to host memory address
space while the Resolve extension passed CUDA/OpenCL addresses to reduce
memory transfer overhead for better real time processing. OpenFX plugins
are build as bundles of objects(?) (MODULE library build in CMake).

The basic structure is a plugin that offers processing with CPU, OpenCL
or CUDA depending on the processing mode the host application is using.
This plugin is bundled into a single module library which is loaded by
Resolve. For the plugin a few helper classes are used to handle the
Plugin metadata (user interface, host communication) while CUDA/OpenCL
control code is also seperated into two separate files (OpenCLKernel.cpp
and CudaKernel.cu). Both contain the GPU Kernel itselt and a host
function which is included in the main Plugin just via extern
declaration. Sample:
> extern void RunCudaKernel(int p_Width, int p_Height, float* p_Gain,
> const float* p_Input, float* p_Output);

The Makefile then just compiles all cpp files with the standard $(CXX)
compiler and the CudaKernel.cu with $(NVCC) which is defined before.
Then a simple
> $(CXX) -bundle $^ -o $@ -L${CUDAPATH}/lib -lcuda -lcudart
> -F/Library/Frameworks -framework CUDA -framework OpenCL
does the linking and works fine.


I tried to replicate this structure of linking in CMake and it works as
long as I keep CUDA deactivated (One of the reasons of building a
flexible CMake infrastructure is making a few parts configurable via
CMake/Compiler options). Most stuff is working now, but I have a problem
integrating the CUDA part.

For OpenCL I just build an object library from the OpenCLKernel.cpp and
add it as a target object:
> add_library(GainLibOpenCL OBJECT OpenCLKernel.cpp)
...
> add_library(${PLUGIN_NAME} MODULE src/${PLUGIN_NAME}.cpp
> $<TARGET_OBJECTS:GainLibOpenCL>)

I tried to replicate this for the CUDA code but cuda_add_library doesn't
seem to support generating object files and a combination of
cuda_compile + add_library also doesn't allow to generate object files
so how do I replicate the Makefile result.

Here are two examples how I tried different methods. Did a few more
tests based on many results of questions on the net but non solved my
problem.

Variant 1:
>  cuda_add_library(GainLibCUDA CudaKernel.cu)
>  set(LIBS ${LIBS} GainLibCUDA PARENT_SCOPE)
Will compile but result in a crash of Resolve, with STATIC as an option
for cuda_add_library it builds and Resolve stays open, but processing
isn't working. And it links to the CUDA static libraries which isn't
intended as the host cuda lib should be used.

>  cuda_compile(cuda_exec_obj CudaKernel.cu)
>  add_library(GainLibCUDA OBJECT CudaKernel.h ${cuda_exec_obj})
>  set(TARGET_OBJECTS ${TARGET_OBJECTS} $<TARGET_OBJECTS:GainLibCUDA>
> PARENT_SCOPE)

Results in the error:
> CMake Error at src/CUDA/CMakeLists.txt:21 (add_library):
>   OBJECT library "GainLibCUDA" contains:
>
>     cuda_compile_1_generated_CudaKernel.cu.o
>
>   but may contain only sources that compile, header files, and other
> files
>   that would not affect linking of a normal library.

Also just adding "cuda_compile(cuda_exec_obj CudaKernel.cu)" and then
${cuda_exec_obj} as a file to the "add_library(${PLUGIN_NAME} MODULE
..." line results in and error: "Cannot find source file".

So this mail got pretty long but I hope this helps someone to help me
and then also help others if they reach a similar problem.


Kind regards,
Ingmar
--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Problems building a MODULE library (OpenFX plugin) with correct cuda object linking

Robert Maynard
I believe you will want to use the low level command CUDA_WRAP_SRCS
with the MODULE option. Since CUDA_WRAP_SRCS is a low level command,
If you need separable compilation you will need to manually invoke
those steps too ( read CUDA_SEPARABLE_COMPILATION documentation on
what methods you will need to use ).

On Tue, Jan 10, 2017 at 1:30 PM,  <[hidden email]> wrote:

> Hello,
>
> after hours and hours of searching and trying to get it to work I hope
> someone here can help me as I'm now out of ideas. I'm trying to build an
> OpenFX plugin for DaVinci Resolve (a movie color grading software,
> https://www.blackmagicdesign.com/products) via CMake. Resolve is delivered
> with a developer sample plugin using a standard Makefile (Mac) and project
> files for Apple XCode/VisualStudio. But for a better structure I wanted to
> build a CMake build framework for this plugin.
>
> Notes for better understanding: The CUDA implementation is a proprietary Add
> On to the OpenSource OpenFX interfaces as far as I understand it. Stock
> OpenFX would pass memory references only to host memory address space while
> the Resolve extension passed CUDA/OpenCL addresses to reduce memory transfer
> overhead for better real time processing. OpenFX plugins are build as
> bundles of objects(?) (MODULE library build in CMake).
>
> The basic structure is a plugin that offers processing with CPU, OpenCL or
> CUDA depending on the processing mode the host application is using. This
> plugin is bundled into a single module library which is loaded by Resolve.
> For the plugin a few helper classes are used to handle the Plugin metadata
> (user interface, host communication) while CUDA/OpenCL control code is also
> seperated into two separate files (OpenCLKernel.cpp and CudaKernel.cu). Both
> contain the GPU Kernel itselt and a host function which is included in the
> main Plugin just via extern declaration. Sample:
>>
>> extern void RunCudaKernel(int p_Width, int p_Height, float* p_Gain, const
>> float* p_Input, float* p_Output);
>
>
> The Makefile then just compiles all cpp files with the standard $(CXX)
> compiler and the CudaKernel.cu with $(NVCC) which is defined before. Then a
> simple
>>
>> $(CXX) -bundle $^ -o $@ -L${CUDAPATH}/lib -lcuda -lcudart
>> -F/Library/Frameworks -framework CUDA -framework OpenCL
>
> does the linking and works fine.
>
>
> I tried to replicate this structure of linking in CMake and it works as long
> as I keep CUDA deactivated (One of the reasons of building a flexible CMake
> infrastructure is making a few parts configurable via CMake/Compiler
> options). Most stuff is working now, but I have a problem integrating the
> CUDA part.
>
> For OpenCL I just build an object library from the OpenCLKernel.cpp and add
> it as a target object:
>>
>> add_library(GainLibOpenCL OBJECT OpenCLKernel.cpp)
>
> ...
>>
>> add_library(${PLUGIN_NAME} MODULE src/${PLUGIN_NAME}.cpp
>> $<TARGET_OBJECTS:GainLibOpenCL>)
>
>
> I tried to replicate this for the CUDA code but cuda_add_library doesn't
> seem to support generating object files and a combination of cuda_compile +
> add_library also doesn't allow to generate object files so how do I
> replicate the Makefile result.
>
> Here are two examples how I tried different methods. Did a few more tests
> based on many results of questions on the net but non solved my problem.
>
> Variant 1:
>>
>>  cuda_add_library(GainLibCUDA CudaKernel.cu)
>>  set(LIBS ${LIBS} GainLibCUDA PARENT_SCOPE)
>
> Will compile but result in a crash of Resolve, with STATIC as an option for
> cuda_add_library it builds and Resolve stays open, but processing isn't
> working. And it links to the CUDA static libraries which isn't intended as
> the host cuda lib should be used.
>
>>  cuda_compile(cuda_exec_obj CudaKernel.cu)
>>  add_library(GainLibCUDA OBJECT CudaKernel.h ${cuda_exec_obj})
>>  set(TARGET_OBJECTS ${TARGET_OBJECTS} $<TARGET_OBJECTS:GainLibCUDA>
>> PARENT_SCOPE)
>
>
> Results in the error:
>>
>> CMake Error at src/CUDA/CMakeLists.txt:21 (add_library):
>>   OBJECT library "GainLibCUDA" contains:
>>
>>     cuda_compile_1_generated_CudaKernel.cu.o
>>
>>   but may contain only sources that compile, header files, and other files
>>   that would not affect linking of a normal library.
>
>
> Also just adding "cuda_compile(cuda_exec_obj CudaKernel.cu)" and then
> ${cuda_exec_obj} as a file to the "add_library(${PLUGIN_NAME} MODULE ..."
> line results in and error: "Cannot find source file".
>
> So this mail got pretty long but I hope this helps someone to help me and
> then also help others if they reach a similar problem.
>
>
> Kind regards,
> Ingmar
> --
>
> Powered by www.kitware.com
>
> Please keep messages on-topic and check the CMake FAQ at:
> http://www.cmake.org/Wiki/CMake_FAQ
>
> Kitware offers various services to support the CMake community. For more
> information on each offering, please visit:
>
> CMake Support: http://cmake.org/cmake/help/support.html
> CMake Consulting: http://cmake.org/cmake/help/consulting.html
> CMake Training Courses: http://cmake.org/cmake/help/training.html
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/cmake
--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake
dev
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Problems building a MODULE library (OpenFX plugin) with correct cuda object linking

dev
Hey,

thank you for your answer. I already tried with CUDA_WRAP_SRCS but
didn't really get how to use it and the
https://cmake.org/cmake/help/v3.7/module/FindCUDA.html lacks of any
samples really showing what is going on. How can I use CUDA_WRAP_SRCS to
create the OBJECT and then add it to a library? add_library also only
supports source files (Cannot find source file error when trying to add
an object).

Is there an example anywhere that demonstrates how to manually add a
CUDA object there?

On 2017-01-11 21:42, Robert Maynard wrote:
> I believe you will want to use the low level command CUDA_WRAP_SRCS
> with the MODULE option. Since CUDA_WRAP_SRCS is a low level command,
> If you need separable compilation you will need to manually invoke
> those steps too ( read CUDA_SEPARABLE_COMPILATION documentation on
> what methods you will need to use ).


--
Regards,
Ingmar
--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Problems building a MODULE library (OpenFX plugin) with correct cuda object linking

Robert Maynard
Hi,

Here is a example that uses CUDA_WRAP_SRCS and separable compilation.
I quickly ported the code from a project, so it most likely has some
minor issues.

https://git.io/vMga3

On Thu, Jan 12, 2017 at 5:04 PM, Ingmar Rieger <[hidden email]> wrote:

> Hey,
>
> thank you for your answer. I already tried with CUDA_WRAP_SRCS but didn't
> really get how to use it and the
> https://cmake.org/cmake/help/v3.7/module/FindCUDA.html lacks of any samples
> really showing what is going on. How can I use CUDA_WRAP_SRCS to create the
> OBJECT and then add it to a library? add_library also only supports source
> files (Cannot find source file error when trying to add an object).
>
> Is there an example anywhere that demonstrates how to manually add a CUDA
> object there?
>
>
> On 2017-01-11 21:42, Robert Maynard wrote:
>>
>> I believe you will want to use the low level command CUDA_WRAP_SRCS
>> with the MODULE option. Since CUDA_WRAP_SRCS is a low level command,
>> If you need separable compilation you will need to manually invoke
>> those steps too ( read CUDA_SEPARABLE_COMPILATION documentation on
>> what methods you will need to use ).
>
>
>
> --
> Regards,
> Ingmar
--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake
Loading...