Esiste un modo raccomandato per comunicare la programmazione scientifica / ingegneristica agli sviluppatori C?

15

Ho un sacco di codice MATLAB che deve essere trasferito su C (la velocità di esecuzione è fondamentale per questo lavoro) come parte di un processo di back-end per un'applicazione web. Quando cerco di esternalizzare questo codice a uno sviluppatore C, suppongo (correggimi se sbaglio) alcuni sviluppatori di C capiscono anche il codice MATLAB (cose come l'indicizzazione e la gestione della memoria sono diverse, ecc.). Mi chiedo se ci sono sviluppatori C là fuori che possono raccomandare una procedura da seguire per comunicare al meglio cosa fa il codice?

Ad esempio, dovrei fornire il codice MATLAB e spiegare cosa sta facendo linea per linea? Oppure, dovrei semplicemente fornire l'algoritmo matematico, spiegarlo in un semplice inglese e lasciare che lo sviluppatore C lo implementa con questa comprensione a modo suo (ad esempio, posso supporre che lo sviluppatore comprenda come lavorare con matematica complessa (cioè immaginaria numeri), come generare istogrammi, eseguire un FFT, ecc.)?

Oppure, esiste un metodo migliore? Mi aspetto che non sia il primo a doverlo fare, quindi mi chiedo se qualche sviluppatore C là fuori si imbattesse in questa situazione e possa condividere qualsiasi saggezza convenzionale su come vorrebbero trasferire questo compito?

Grazie in anticipo per eventuali commenti.

    
posta gkdsp 30.01.2011 - 04:29
fonte

7 risposte

15

Sono in una situazione simile a quella in cui ho anche persone che portano il mio codice Matlab in C ++.

Molto dipende dalla complessità del tuo codice, nonché dal livello di competenza dello sviluppatore C / C ++ e dalla loro comprensione di ciò che dovrebbero implementare - meglio sono e meglio capiscono il tuo problema più autonomamente possono lavorare.

Poiché la traduzione diretta del codice Matlab in C / C ++ potrebbe non essere il modo più efficiente per gestire un problema, suggerisco di comunicare bene l'input, il codice che dovrebbe eseguire e ciò che si suppone restituisca come produzione. Dovresti anche fornire dei modi per testare il codice per assicurarti che funzioni correttamente - sia come aiuto per il debug che come mezzo per il controllo della qualità. Oltre a questo, dovresti fornire e spiegare il codice Matlab come una linea guida approssimativa su come ottenere il risultato.

Dovresti essere in grado di assumere che lo sviluppatore sappia come strutturare un programma e come usare gli strumenti di debug. Tuttavia, potrebbe non essere necessariamente in grado di assumere che lo sviluppatore sappia come avere conoscenze specifiche, ad esempio statistiche o ottimizzazione (matematica). Pertanto, il debug di queste parti sarà molto più veloce con il tuo input.

Potrebbe essere utile programmare riunioni periodiche con lo sviluppatore, in modo che "piccole cose" che potrebbero sembrare un po 'strane per lo sviluppatore, ma che segnaleranno problemi importanti a te, possano essere comunicate prima che si trasformino in grandi problemi.

    
risposta data 30.01.2011 - 04:47
fonte
12

Non sto dicendo che questo si applica a te, ma: la maggior parte delle persone che codificano solo in MATLAB scrivono codice errato. Molto male, con scarsa formattazione, struttura e documentazione.

Quando questo è il caso, l'unico modo semplice per utilizzare il codice MATLAB è eseguirlo per verificare i risultati dal codice portato. Cercare di decodificare il codice MATLAB senza documentazione aggiuntiva è qualcosa che dovrebbe essere intrapreso solo se l'autore originale del codice MATLAB è effettivamente morto o in stato di coma. D'altra parte, un documento matematico ben scritto su un algoritmo è di solito molto più utile dell'implementazione dello studente laureato dell'autore.

Per semplificare il porting del tuo codice:

  1. Rifatta il tuo codice per assicurarti che le operazioni siano suddivise in funzioni diverse. Lo stile MATLAB per una singola funzione per file incoraggia le funzioni a essere troppo lunghe e comprende troppe operazioni. Assicurati inoltre che il codice duplicato venga estratto nelle funzioni di supporto, anche se questo comporta più file di quelli che normalmente vorrai utilizzare per un progetto MATLAB.

  2. Spiega tutti i numeri o le costanti magici usati nel tuo codice e le condizioni in base alle quali sono validi.

  3. Documenta le strutture dati del tuo codice. Lo stile "tutto è a matrice" di MATLAB è molto diverso dalla maggior parte delle lingue e spesso significa che le strutture dei dati sono definite implicitamente dal modo in cui si utilizzano le matrici. Un programmatore C dovrà capire come impostare le varie strutture e allocare gli array necessari, quindi assicurati che sia chiaro quali sono i significati e le strutture interne delle tue variabili.

  4. Documenta gli algoritmi utilizzati dal tuo codice. In particolare, assicurarsi che sia chiaro cosa succede quando si utilizzano funzioni e operatori complicati dell'intero array e assicurarsi che il programmatore C abbia accesso ai riferimenti sugli algoritmi utilizzati da qualsiasi funzione della casella degli strumenti o funzioni della libreria standard che sono più complicate di Funzioni BLAS.

  5. Documenta qualsiasi cosa tu abbia fatto per rendere il codice robusto, come la validazione dell'input e la gestione degli errori. Il modo in cui l'hai implementato è probabilmente molto diverso da come dovrà essere fatto in C. Gli accademici che scrivono codice MATLAB raramente si preoccupano di apprendere cose come la gestione delle eccezioni. Se non hai fatto nulla per rendere il tuo codice robusto, almeno documenta cosa potrebbe essere fatto sull'input non valido o sui dati difettosi o parziali.

  6. Assicurarsi che la persona che porta il codice sia in grado di confrontare l'output con il codice MATLAB originale e, se possibile, fornire una suite di test completa di input e output corretto.

  7. Se la persona che esegue il porting non conosce l'analisi numerica, è necessario supervisionare il processo di porting e assicurarsi di rivedere e comprendere il codice C. Sarà molto educativo per entrambi.

risposta data 30.01.2011 - 07:57
fonte
4

I linguaggi di programmazione sono molto più facili da leggere rispetto alla scrittura. La maggior parte dei programmatori C con un minimo di esperienza dovrebbe essere in grado di leggere il codice Matlab con l'accesso a un riferimento e, in particolare, con l'accesso a un programmatore Matlab per rispondere alle loro domande. Il codice di qualsiasi tipo è molto meno ambiguo della maggior parte dei requisiti che dobbiamo risolvere.

Se hanno una laurea in informatica o ingegneria informatica, probabilmente avranno preso il calcolo, la trigonometria e l'algebra lineare, ma potrebbe essere arrugginito. A meno che non facciano molta programmazione scientifica / matematica, la maggior parte dei programmatori C sapranno cos'è una FFT, ma raramente o mai ne hanno fatto una. Il tuo candidato ideale avrà tutto ciò che è fresco nella sua mente, ma chiunque abbia una laurea dovrebbe essere in grado di gestire la matematica con qualche studio di aggiornamento. In entrambi i casi, vuoi qualcuno che enfatizzi di trovare le librerie esistenti per operazioni comuni come quella, quando possibile, anziché eseguire il rollover.

Il talento per essere in grado di ottimizzare il tempo di esecuzione dell'algoritmo varia ampiamente anche tra i programmatori esperti. Ti consiglierei di avere un problema con l'intervista per scoprirlo. Mostra ai candidati un algoritmo semplice ma intenzionalmente inefficiente e chiedi loro cosa fa. Vedi se sollevano la sua inefficienza da soli. Chiedi loro quale sia la complessità asintotica e cosa dovrebbe essere. Chiedi loro come potrebbero riscrivere per migliorare l'efficienza.

    
risposta data 30.01.2011 - 06:33
fonte
3

Il motivo finanziario per non usare il compilatore matlab è ben comprensibile. Tuttavia, è possibile utilizzare il convertitore gratuito da scilab a C. La procedura dovrebbe essere

  • Converti il tuo codice da Matlab a Scilab con M2SCI strumenti ,
  • Converti il codice Scilab in C usando "Scilab 2 C ",
  • Prova i codici incrociati,
  • Usa a profiler per cercare colli di bottiglia bisogno di un occhio umano.

Idealmente non è necessaria alcuna conoscenza di Scilab nel processo ed è abbastanza facile prendere tempo per provare questa soluzione (in pratica, forse non è così semplice ...)

Nota: non ho provato questo, ma è una soluzione che mi immagino per motivi simili.

    
risposta data 30.01.2011 - 10:52
fonte
2

Sviluppa un buon set di test che puoi eseguire attraverso entrambe le applicazioni e quindi dare un'occhiata alle metriche.

Ciò aiuterà notevolmente lo sviluppatore a testare il codice e a garantire che la qualità sia a un livello ragionevole.

    
risposta data 30.01.2011 - 05:03
fonte
2

Ottimo post di Jonas, in particolare il punto su come fornire un modo per testare il codice. Ecco alcuni suggerimenti aggiuntivi:

  • Codice di condivisione. Considera di fornire la sorgente MATLAB ma preparati a spiegare la sua struttura o altri dettagli (dalla sintassi al tuo stile personale). Speriamo che lo sviluppatore C riconosca concetti di alto livello, algoritmi e matematica ( e si spera che abbia commentato il tuo codice ).

  • Documentazione. Sarà fondamentale disporre di una documentazione chiara che definisca il progetto; dopo tutto, se la persona non è fluente in MATLAB, il codice potrebbe non essere un riferimento molto utile.

  • Esercitare competenze per le persone. Questo può essere ovvio, ma è bene tenere a mente quando si collabora, specialmente su questo tipo di micro livello. Quindi dovresti provare a rimuovere il più possibile ambiguità dal tuo codice / documentazione. A seconda del tuo livello di leadership nel progetto, potresti scoprire di trovare un equilibrio tra guidare lo sviluppo e permettere alla persona di dare il proprio contributo individuale.

risposta data 30.01.2011 - 05:04
fonte
1

A meno che i tuoi programmatori C non usino le librerie giuste, Matlab è molto più bravo in cose banali quanto invertire una matrice. Un imploso C impl. non è abbastanza stabile Assumere codificatori C sarebbe costoso. Vorrei provare a eseguire il porting del codice Matlab per scipy e confrontare la velocità, provare ad usare il compilatore c di Matlab, o ... semplicemente gettare più hardware su di esso - potrebbe essere molto più economico e semplice, più sicuro e più veloce.

    
risposta data 31.01.2011 - 03:20
fonte

Leggi altre domande sui tag