¿Hay alguna forma recomendada de comunicar la programación científica / de ingeniería a los desarrolladores de C?

16

Tengo una gran cantidad de código MATLAB que necesita ser portado a C (la velocidad de ejecución es crítica para este trabajo) como parte de un proceso de back-end para una aplicación web. Cuando intento externalizar este código a un desarrollador de C, supongo (corríjame si me equivoco) pocos desarrolladores de C también entienden el código de MATLAB (cosas como la indexación y la administración de memoria son diferentes, etc.). Me pregunto si hay algún desarrollador de C que pueda recomendarme un procedimiento a seguir para comunicar mejor lo que hace el código.

Por ejemplo, ¿debo proporcionar el código MATLAB y explicar lo que está haciendo línea por línea? O, solo debo proporcionar el algoritmo / matemática, explicarlo en inglés simple y dejar que el desarrollador C lo implemente con esta comprensión a su manera (por ejemplo, ¿puedo suponer que el desarrollador comprende cómo trabajar con matemáticas complejas (es decir, imaginario números), ¿cómo generar histogramas, realizar una FFT, etc.)?

¿O hay un método mejor? Supongo que no soy el primero en necesitar hacer esto, así que me pregunto si algún desarrollador de C se encontró con esta situación y puede compartir alguna sabiduría convencional sobre cómo les gustaría que se transfiriera esta tarea.

Gracias de antemano por cualquier comentario.

gkdsp
fuente
3
¿has intentado usar mcc para convertir el código de matlab a c? creo que esmcc -c matlabfile.m
Will Tate
44
Cuando contrate al programador, especifique que debe comprender el código C y Matlab. Dado su énfasis en la velocidad, probablemente debería usar C ++ en lugar de C (con cierto cuidado, nunca es más lento y, a menudo, más rápido).
Jerry Coffin
3
@willytate: Esto requiere que tengas el compilador de Matlab, no produce código particularmente eficiente, y hay algunas limitaciones sobre qué código puedes compilar.
Jonas
3
Si realiza un tipo de programación orientada a objetos en C, no solo se priva de la oportunidad de que el compilador realice verificaciones adicionales de seguridad de tipo, sino que le priva al compilador de la posibilidad de realizar ciertos tipos de optimizaciones que no se pueden expresar fácilmente en C. Además, el uso de C ++ aumenta las posibilidades de que pueda usar la funcionalidad de una biblioteca escrita por alguien más inteligente que usted.
3
¿Se pasa la mayor parte del tiempo en el algoritmo real o jugando con archivos, IO y análisis? El codificador C promedio no podrá escribir código FFT y matriz que se acerque a competir con la implementación de MATLAB. Si el análisis, la E / S y la manipulación de archivos es donde su programa pasa su tiempo, entonces su programador de C debería centrarse en eso y escribir un código de pegamento que llame a las funciones de las bibliotecas de MATLAB. Si la resolución de FFT / descomposición matricial / ODE es el cuello de botella, entonces tiene que encontrar un programador en C con MUCHA experiencia en métodos numéricos.
Charles E. Grant

Respuestas:

15

Estoy en una situación similar a la tuya en que también tengo personas que transfieren mi código de Matlab a C ++.

Mucho depende de la complejidad de su código, así como del nivel de habilidad del desarrollador de C / C ++ y de su comprensión de lo que se supone que deben implementar: cuanto mejor sean y mejor comprendan su problema, más independientemente pueden trabajar.

Dado que la traducción directa del código de Matlab a C / C ++ puede no ser la forma más eficiente de manejar un problema, le sugiero que comunique bien cuál es la entrada, qué debe hacer el código y qué se supone que debe devolver como salida. También debe proporcionar formas de probar el código para asegurarse de que funciona correctamente, tanto como una ayuda para la depuración como un medio para el control de calidad. Además de eso, debe proporcionar y explicar el código de Matlab como una guía aproximada de cómo se puede lograr el resultado.

Debería poder suponer que el desarrollador sabe cómo estructurar un programa y cómo utilizar las herramientas de depuración. Sin embargo, es posible que no pueda suponer necesariamente que el desarrollador sabe cómo tener conocimientos específicos en, por ejemplo, estadísticas u optimización (matemática). Por lo tanto, la depuración de estas partes será mucho más rápida con su entrada.

Puede ser útil programar reuniones periódicas con el desarrollador, de modo que las "pequeñas cosas" que puedan parecer un poco extrañas para el desarrollador, pero que le indiquen problemas importantes, puedan comunicarse antes de que se conviertan en problemas importantes.

Jonas
fuente
+1 por tener resultados de prueba válidos para el software. Portar código de Matlab a C / C ++ es bastante difícil sin saber cómo deberían ser los resultados.
rjzii
12

No digo que esto se aplique a usted, pero: la mayoría de las personas que solo codifican en MATLAB escriben código incorrecto. Muy mal, con formato, estructura y documentación deficientes.

Cuando este es el caso, la única forma fácil de utilizar el código MATLAB es ejecutarlo para verificar los resultados del código portado. Intentar realizar una ingeniería inversa del código MATLAB sin documentación adicional es algo que solo debe llevarse a cabo si el autor original del código MATLAB está realmente muerto o en coma. Por otro lado, un artículo matemático bien escrito sobre un algoritmo suele ser mucho más útil que la propia implementación del estudiante graduado del autor.

Para que sea más fácil para la persona portar su código:

  1. Refactorice su código para asegurarse de que las operaciones se desglosen en diferentes funciones. El estilo de una función por archivo de MATLAB fomenta que las funciones sean demasiado largas y abarquen demasiadas operaciones. También asegúrese de que el código duplicado se extraiga a las funciones auxiliares, incluso si esto genera más archivos de los que normalmente desearía trabajar para un proyecto MATLAB.

  2. Explica los números mágicos o constantes utilizados en tu código y las condiciones bajo las cuales son válidos.

  3. Documente las estructuras de datos de su código. El estilo de "todo es una matriz" de MATLAB es muy diferente de la mayoría de los idiomas, y a menudo significa que sus estructuras de datos se definen implícitamente por la forma en que utiliza las matrices. El programador de CA necesitará descubrir cómo configurar las diversas estructuras y asignar las matrices necesarias, así que asegúrese de tener claro cuáles son los significados y las estructuras internas de sus variables.

  4. Documente los algoritmos utilizados por su código. En particular, asegúrese de que esté claro lo que sucede cuando utiliza funciones y operadores complicados de conjunto completo, y asegúrese de que el programador C tenga acceso a referencias sobre los algoritmos utilizados por cualquier función de caja de herramientas o funciones de biblioteca estándar que sean más complicadas que Funciones BLAS.

  5. Documente todo lo que haya hecho para que el código sea robusto, como la validación de entrada y el manejo de errores. La forma en que lo implementó es probablemente muy diferente de cómo tendrá que hacerse en C. Los académicos que escriben código MATLAB rara vez se molestan en aprender sobre cosas como el manejo de excepciones. Si no ha hecho nada para hacer que su código sea robusto, al menos documente lo que se podría hacer sobre una entrada no válida o datos defectuosos o parciales.

  6. Asegúrese de que la persona que transfiere el código pueda comparar la salida con el código MATLAB original y, si es posible, proporcione un conjunto completo de pruebas de entrada y salida correcta.

  7. Si la persona que realiza la transferencia no conoce el análisis numérico, deberá supervisar el proceso de transferencia y asegurarse de revisar y comprender el código C. Será muy educativo para los dos.

usuario23748
fuente
Estoy de acuerdo con su evaluación técnica y usted hace buenos puntos (1 - 7), pero creo que el anuncio hominem en la parte superior sobre "la mayoría de las personas que solo codifican en MATLAB" era innecesario y falso.
55
Según mi experiencia, la mayoría de las personas que usan MATLAB como su único lenguaje de programación son personas de matemáticas aplicadas, para quienes la programación generalmente no es más que un medio para un fin. No tienen ningún incentivo para preocuparse por la práctica de la programación, y solo se preocupan por escribir el código correcto, no el código bueno o hermoso. Cuando comparten su código, generalmente está destinado a usarse, pero no a leerse; siempre hay un documento para explicar el código. Si crees que esto es ofensivo (y no está destinado a serlo), simplemente estás perdiendo la perspectiva de las personas a las que no les importa.
44
En mi experiencia, el código incorrecto está escrito principalmente por personas que escriben código de una sola vez, es decir, código que será utilizado (leído) por una sola persona para un solo problema. El lenguaje de programación no importa. Y para mí, como una persona que programa principalmente en Matlab, el anuncio hominem parece ofensivo.
Jonas
Como EE, principalmente se espera que escriba MATLAB, y estoy de acuerdo con usted. Fomenta un estilo de codificación muy horrible sin alcance, espacio de nombres, organización en estructuras de datos o buen nombre de variables. Una vez que se entiende la vectorización, uno realmente no se molesta en comentar sobre cualquiera de las ingeniosas maravillas de una línea resultantes. Solo un montón de basura gigante de código feo e ineficiente.
Milind R
4

Los lenguajes de programación son mucho más fáciles de leer que escribir. La mayoría de los programadores de C con un mínimo de experiencia deberían poder leer su código de Matlab perfectamente con acceso a una referencia, y especialmente con acceso a un programador de Matlab para responder sus preguntas. El código de cualquier tipo es mucho menos ambiguo que la mayoría de los requisitos con los que tenemos que trabajar.

Si tienen una licenciatura en ciencias de la computación o ingeniería informática, es probable que hayan tomado cálculo, trigonometría y álgebra lineal, pero puede estar oxidado. A menos que hagan mucha programación científica / matemática, la mayoría de los programadores de C sabrán qué es un FFT, pero rara vez o nunca tuvieron que hacer uno. Su candidato ideal tendrá todo eso fresco en su mente, pero cualquier persona con un título debería ser capaz de manejar las matemáticas con algún estudio de actualización. En cualquier caso, desea a alguien que enfatice la búsqueda de bibliotecas existentes para operaciones comunes como esa siempre que sea posible en lugar de crear las suyas propias.

El talento para poder optimizar el tiempo de ejecución del algoritmo varía ampliamente incluso entre programadores experimentados. Te recomendaría que tengas un problema de entrevista para descubrirlo. Muestre a los candidatos un algoritmo simple pero intencionalmente ineficiente y pregúnteles qué hace. Vea si ellos mencionan su ineficiencia por su cuenta. Pregúnteles cuál es la complejidad asintótica y cuál debería ser. Pregúnteles cómo reescribirán para mejorar la eficiencia.

Karl Bielefeldt
fuente
3

La razón financiera para no usar el compilador matlab es muy comprensible. Sin embargo, puede usar el convertidor gratuito de scilab a C. El procedimiento seria

  • Convierta su código de Matlab a Scilab con las herramientas M2SCI ,
  • Convierta el código Scilab a C usando "Scilab 2 C" ,
  • Prueba cruzada de los códigos,
  • Use un generador de perfiles para buscar cuellos de botella que necesitan un ojo humano.

Idealmente, no se necesita conocimiento de Scilab en el proceso y es bastante fácil tomarse un tiempo para probar esta solución (en la práctica, tal vez no sea tan simple ...)

Nota: No probé esto, pero es una solución que me imagino por razones similares.

Clemente J.
fuente
2

Desarrolle un buen conjunto de pruebas que pueda ejecutar en ambas aplicaciones y luego eche un vistazo a las métricas.

Esto ayudará enormemente a su desarrollador a probar su código y garantizará que la calidad se encuentre en un nivel razonable.


fuente
2

Gran publicación de Jonas, especialmente el punto de proporcionar una forma de probar el código. Aquí hay algunas sugerencias adicionales:

  • Compartir código Considere proporcionar la fuente de MATLAB, pero esté preparado para explicar su estructura u otros detalles (desde la sintaxis hasta su estilo personal). El desarrollador de C con suerte reconocerá los conceptos de alto nivel, los algoritmos y las matemáticas ( y esperamos que haya comentado su código ).

  • Documentación. Será crucial que tenga una documentación clara que defina el proyecto; después de todo, si la persona no domina MATLAB, el código puede no ser una referencia muy útil.

  • Ejercicio de habilidades de personas. Esto puede ser obvio, sin embargo, es bueno tenerlo en cuenta al colaborar, especialmente en este tipo de micro nivel. Por lo tanto, debe intentar eliminar tanta ambigüedad de su código / documentación como sea posible. Dependiendo de su nivel de liderazgo en el proyecto, es posible que encuentre un equilibrio entre guiar el desarrollo y dejar que la persona haga su propia contribución individual.

Gary
fuente
1

A menos que sus codificadores C usen las bibliotecas correctas, Matlab es mucho mejor en cosas tan triviales como invertir una matriz. Un ingenuo C impl. No es lo suficientemente estable. Contratar codificadores C sería costoso. Intentaría portar el código de Matlab para escanear y comparar la velocidad, tratar de usar el compilador c de Matlab, o ... simplemente arrojarle más hardware: podría ser mucho más barato, más simple, más seguro y más rápido.

Trabajo
fuente