Adesso che nell’articolo sulle Coordinate Omogenee abbiamo imparato a comporre le trasformazioni nel piano possiamo facilmente ricavarci la formula di un punto ruotato rispetto ad un punto generico .
Per ottenerla basta applicare una operazione di traslazione nell’origine del punto , una rotazione rispetto all’origine di e successivamente una nuova traslazione che riporti A al suo posto 🙂
Se compiliamo con NVCC in modo che utilizzi un Virtual Code possiamo utilizzare il programma su qualunque architettura di GPU però abbiamo un delay allo startup dell’applicazione, come descritto a pagina 25 del manuale di NVCC di CUDA 7.
CUDA_Compiler_Driver_NVCC.pdf
Che si trova nel seguente direttorio: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0\doc\pdf
“By specifying a virtual code architecture instead of a real GPU, nvcc postpones theassembly of PTX code until application runtime, at which the target GPU is exactlyknown. For instance, the command below allows generation of exactly matching GPUbinary code, when the application is launched on an sm_20 or later architecture.nvcc x.cu –gpu-architecture=compute_20 –gpu-code=compute_20The disadvantage of just in time compilation is increased application startup delay,but this can be alleviated by letting the CUDA driver use a compilation cache (refer to”Section 3.1.1.2. Just-in-Time Compilation” of CUDA C Programming Guide) which ispersistent over multiple runs of the applications.”
Non possiamo con la rappresentazione matriciale presentata nell’articolo sulle Trasformazioni Nel Piano concatenare la rotazione e la scala con la traslazione. Questo perché in questo secondo caso abbiamo una somma matriciale e nei primi due abbiamo una moltiplicazione.
Possiamo però riscrivere le matrici nel cosiddetto “sistema di riferimento omogeneo”. Non starò qui a spiegare il concetto di sistema di riferimento omogeneo, dirò solo che un punto A la cui rappresentazione matriciale è nel sistema di riferimento omogeneo diventa
Le rispettive matrici di trasformazione diventano:
Traslazione:
Rotazione:
Scala:
Vediamo se i conti ci tornano 🙂
Questa volta possiamo utilizzare la moltiplicazione tra matrici anche per la Traslazione.
Traslazione
Che è esattamente il nostro punto traslato in coordinate omogenee.
Rotazione
Che è esattamente il nostro punto ruotato in coordinate omogenee.
Scala
Che è esattamente il nostro punto scalato in coordinate omogenee.
Regola di composizione
Quando si compongono 2 o più trasformazioni la precedente è sempre a destra della successiva. Ovvero se abbiamo 3 trasformazioni , , che vengono fatte in sequenza: Prima , poi e per ultima il punto A’ sarà dato da:
Ieri sera mi sono finalmente deciso a fare l’update del mio sistema operativo Windows 8.1 verso Window 10 come dal 29 Luglio Microsoft mi pressava assai :D.
Ovviamente non l’ho fatto subito perchè ho acquistato un HD di backup. Fatto il mio solito BackUp con Paragon Migrate OS to SSD 4.0 (infallibile!) ho messo il nuovo disco sul PC e ho lanciato l’upgrade.
Per fare il tutto Windows ha impiegato 3 ore…
… ero già pronto al peggio e invece…
Tutto è andato perfettamente. Tutti i driver sono stati installati correttamente
e tutti i programmi che utilizzo più spesso non hanno dato problemi (…fino ad ora… 😀 )
Anzi, anche i driver invidia che stranamente avevano smesso di funzionare (tutti i nuovi installer davano BSOD in fase di installazione) hanno ripreso ad andare.
Direi che fino ad ora sono più che soddisfatto dell’Upgrade.
In cui anche non volendo utilizzare OpenCL se non lo setto forzatamente a “false” ho un overhead nella prima chiamata delle funzioni di image processing.
Installiamo i sorgenti dove più ci piace, per questo esempio io le metterò sul Desktop.
Poi scarichiamo CMake che al momento della stesura di questo articolo è alla versione 3.3.0. Installiamolo. Io ho utilizzato il Win32 Installer.
Scarichiamo ovviamente il CUDA toolkit dal sito della NVIDIA e installiamolo. Al momento di stesura dell’articolo siamo alla versione 7.0. Io ho installato il Windows 8.1 local installer.
Lanciamo CMake e andiamo a dare il percorso dei sorgenti delle OpenCV e della cartella dove vogliamo generare la solution di Visual Studio 2013 per la compilazione:
Spuntare “Grouped” e “Advanced”, cliccare su “Configure” e scegliere “Visual Studio 12 2013 Win64” e poi “Finished” e aspettare il termine.
Al termine dovremmo vedere “configure done” scritto nella finestra di console di CMake ma la parte centrale probabilmente verrà evidenziata di rosso:
Espandiamo il nodo BUILD nella finestra rossa ed eliminiamo la spunta da BUILD_DOCS.
Nel mio caso l’errore deo Config era il fatto che non trova Doxygen. Semplicemente così dovremmo risolvere il conflitto.
Però io ho eliminato anche la generazione degli esempi per velocizzare un po’ la compilazione togliendo la spunta da BUILD_EXAMPLES
Controlliamo che nel nodo CMAKE il valore di CMAKE_LINKER sia il linker di Visual Studio 2013 (v12).
Controlliamo che nel nodo CUDA non sia selezionato (eventualmente togliamo la sputa da) CUDA_ATTACH_VS_BUILD_RULE_TO_CUDA_FILE.
Questo flag server se si eseguono Build in parallelo.
Nel nodo WITH controlliamo che siano selezionati (altrimnenti mettiamo la spunta anche in) WITH_CUBLAS, WITH_CUDA, WITH_OPENGL.
Intanto che compiliamo con CUDA compiliamo anche le CUDA Basic Linear Algebra Subroutines (cuBLAS) e il supporto per le OPEN_GL.
Ripremiamo “Configure” per fare il refresh e per vedere che questa volta la finestra centrale sia “bianca”.
Vi ricordo che ora è bianca perchè abbiamo tolto la spunta da BUILD_DOCS che cercava Doxygen e non per le altre configurazioni fatte.
Se la finestra centrale è bianca e abbiamo “Configure done” allora è tutto Ok e possiamo cliccare su “Generate” per creare la soluzione Visual Studio.
A questo punto dopo “Generating done” possiamo chiudere CMake e andare ad aprire la solution nella cartella dove abbiamo detto di crearla che nel mio caso è: C:\Users\fabio\Desktop\buildCuda
Aprite la solutione, lanciate ALL_BUILD in Debug o Release e andate a prendere un caffè 🙂
Non vi è bastato vero il caffè? Sul mio PC impiega circa un’ora a Build (i7, 12GB ram, SSD HD).
Una volta finito di Compilare lanciate la INSTALL.
Lanciate INSTALL che trovate in (CMakeTargets) per avere nella directory “install” le dll e librerie appena compilate
Ecco dove troverete le vostre DLL e LIB delle OpenCV compilate con CUDA
Io ora ho compilato in Debug.
Lanciando anche la compilazione in Release vedrete insieme le librerie di debug (*d.dll, *d.lib) assieme a quelle di release (*.dll, *.lib).
OpenCV 2.4.9
Per le OpenCV 2.4.9 il procedimento è praticamente identico, però ho dovuto impostare il CUDA_GENERATION dicendo esplicitamente la mia architettura ‘Kepler‘
Altrimenti avevo l’errore di compilazione: Unsupported gpu architecture ‘compute_11’
Ho letto comunque che se si setta l’architettura specifica anche con le OpenCV 3.0 la compilazione è molto più veloce perchè non vengono compilati i file .cu per le altre architatture.
Senza specificarlo invece vengono compilati i .cu per tutte le architatture (GPU): Kepler, Fermi, etc…
E ho dovuto modificare il file NCV.cu (opencv-2.4.9\modules\gpu\src\nvidia\core\NCV.cu), andando ad includere il package “algorithm”:
#include <algorithm>
Altrimenti mi dava l’errore: ‘max’ undefined error.