CUDABOF unter Ubuntu 10.04 32 bit

There was a time, when I shared a blog. This post was written by Stephan. See all blogpost from him or stalk him on github.


Das Open Source Projekt OpenVIDIA : Parallel GPU Computer Vision beschäftigt sich mit Nvidias CUDA-Technology und Computer Vision. U.a gibt es die Beispielanwendung "CUDABOF" (CUDA Bayesian Real-time Optical Flow), in der es um Bewegungserkennung geht (mehr über die Theorie könnt ihr hier erfahren). Die CUDA-GPU soll dabei die Bewegungsberechnungen unterstützen.

Das Programm konnte mit der gegebenen Makefile aber nicht erfolgreich kompiliert werden. Darum gibt es hier eine angepasste Makefile für ein 32Bit System:

###
# Configuration
###

NVIDIA_INSTAL_DIR=$(HOME)/NVIDIA_GPU_Computing_SDK/C
CUDA_BASE=/usr/local/cuda

###
# You shouldn't have to change down from here
###

INCLUDE:= -I.                                        \
      -I/usr/local/cuda/include                  \
      -I$(NVIDIA_INSTAL_DIR)/common/inc/         \
          -I$(CUDA_BASE)/include

CXXFLAGS= -fno-strict-aliasing -DUNIX -O0 -ggdb $(shell pkg-config --cflags opencv)

LDFLAGS= -L$(NVIDIA_INSTAL_DIR)/lib                        \
         -L$(NVIDIA_INSTAL_DIR)/common/lib                 \
     -L$(NVIDIA_INSTAL_DIR)             \
     -L$(CUDA_BASE)/lib                             \
         -lcutil_i386 -lcudart -lGL -lGLU -lglut -lGLEW   \
      $(shell pkg-config --libs opencv) \


NVCCFLAGS = --compile --host-compilation 'C++' \
            --compiler-options -fno-strict-aliasing \
            --compiler-options  -ggdb $(INCLUDE) \
        --compiler-bindir=/usr/bin/gcc-4.3

EXEC = test01                    \
       test02_spatialDerivs      \
       test03_gaussianPyramid    \
       test04_opticalFlow

all: $(EXEC)

VERBOSITY:=@
ECHO_COMPILING=@echo "compiling $@"


######
#
# COMPILATION OF OBJECT FILES
#
######

%.o: %.cu %.hpp CUDABOF.hpp
    $(ECHO_COMPILING)
    $(VERBOSITY)nvcc $(NVCCFLAGS) $<

%.o: %.cpp *.hpp
    $(ECHO_COMPILING)
    $(VERBOSITY)g++ -c $< $(INCLUDE) $(CXXFLAGS)


######
#
# TESTS
#
######

TEST_BUILD_RULE= $(VERBOSITY)g++ -fPIC -o $@ $^ $(LDFLAGS)

test01: test01_kernel.o test01.o Utils.o MathUtils.o
    $(ECHO_COMPILING)
    $(TEST_BUILD_RULE)

test02_spatialDerivs: test02_spatialDerivs.o Utils.o MathUtils.o BayesianOpticalFlowKernels.o
    $(ECHO_COMPILING)
    $(TEST_BUILD_RULE)

test03_gaussianPyramid: test03_gaussianPyramid.o Utils.o MathUtils.o GaussianPyramidKernel.o
    $(ECHO_COMPILING)
    $(TEST_BUILD_RULE)

test04_opticalFlow: test04_opticalFlow.o Utils.o MathUtils.o OpticalFlow.o BayesianOpticalFlowKernels.o GaussianPyramidKernel.o
    $(ECHO_COMPILING)
    $(TEST_BUILD_RULE)

######
#
# TESTS
#
######
clean:
    rm -f *.o $(EXEC)
``

<strong>
Anmerkung:
Falls ihr bei der CUDA-Installation abweichende Pfade genommen habt (vor allem beim CUDA-SDK, das standardmäßig im Home-Ordner des Nutzers installiert wird), müsst ihr die Pfade natürlich anpassen (über die Variablen NVIDIA_INSTAL_DIR und CUDA_BASE am Anfang der Datei).
</strong>

Folgende Bibliotheken/Pakete sind zudem nötig:
<ol>
    <li>OpenCV: libcv-dev</li>
    <li>libhighgui-dev</li>
    <li>Compiler g++ und gcc in Version 4.3 (mit Version 4.4 lässt sich dieses Programm und die Nvidia-Bespiele zu Cuda nicht kompilieren)</li>
</ol>

Nach dem ihr "make" erfolgreich ausgeführt habt, könnt ihr folgende Programme in der Konsole ausführen:
<ul>
    <li>./test01</li>
    <li>./test02_spatialDerivs (Aufruf mit einem Bild als Parameter)</li>
    <li>./test03_gaussianPyramid (Aufruf mit einem Bild als Parameter)</li>
    <li>./test04_opticalFlow</li>
</ul>


"test04_opticalFlow" verwendet bei der Bewegungsvorhersage die GPU und erzeugt auf meinem Laptop so nur 80 Prozent CPU-Auslastung (zum Start des Programms muss eine Webcam/Videokamera angeschlossen sein, die von OpenCV erkannt wird).

Bei Problemen mit der neuen Datei hilft es vielleicht, die originale Makefile mit der angepassten zu vergleichen.

Viele Grüße

Stephan