Android AsyncTask e DeepBelief SDK ( SISSEGV )

Ultimamente sto giochicchiando col DeepBeliefSDK rilasciato da JetPac, una startup acquisita da Google.

Ho avuto molti problemi quando ho provato a portare l’utilizzo della libreria, dal thread principale in cui si trova all’interno degli esempi forniti, ad un thread in background, quello che in tanti linguaggi di programmazione è chiamato Worker o qualcosa del genere, e che in Android prende il nome di AsyncTask.

La libreria fa un pesante uso della CPU, quindi va utilizzata assolutamente in un thread in background, o l’applicazione stenterà decisamente (su un Galaxy S5 ci vogliono 650ms per classificare un’immagine, sul mio terminale di più). Durante le mie prove con il thread in background l’applicazione crashava sempre, con un bel Segmentation Fault (SISSEGV error recitava la riga di errore che compariva sul LogCat se non sbaglio) e nessuno stacktrace utile (si tratta pur sempre di codice nativo C++).

Quando tutto sembrava ormai perduto ho trovato questo articolo. Per farla breve, DeepBelief usa Open MP (da wikipedia:
OpenMP (Open Multiprocessing) è un API multipiattaforma per la creazione di applicazioni parallele su sistemi a memoria condivisa.).
Ma esiste un bug nel modo in cui GOMP (implementazione GCC delle specifiche OpenMP) gestisce la memoria quando non è possibile accedere alla memoria locale del thread.

Morale della favola, quando il thread su cui è eseguita una funzione della libreria (l’AsyncTask) cerca di accedere alla memoria locale del Thread si ha un bel crash. La soluzione suggerita è ricompilare l’intero DeepBeliefSDK con una toolchain GCC a cui è stata applicata una patch particolare, che in qualche modo (non chiedetemi come) risolve il problema.

Qua trovate l’SDK ricompilato, pronto all’uso anche all’interno del thread in background.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *