python debugging segmentation-fault opencl pyopencl

python - PyOpenCl: ¿cómo depurar la falla de segmentación?



debugging segmentation-fault (4)

No sacaría conclusiones sin probar completamente su suite de software. Está ejecutando la última versión lanzada de PyOpenCl . Lo más probable es que esté transfiriendo algo al módulo que no se está completando correctamente y el módulo de fondo no realiza la comprobación de errores necesaria antes de usar algo que no está debidamente poblado (imposible realmente ayudarlo a depurar sin ningún código) Hecho disponible)

¿Ha intentado utilizar el depurador de python para establecer diferentes puntos de interrupción ( import pdb; pdb.set_trace() ) justo antes de diferentes llamadas pyopencl para ver incluso en qué parte de su código está fallando seg? Esta debería ser definitivamente tu primera tarea. Cuando descubra dónde está fallando seg, necesita mirar de cerca pyopencl examples / api para ver por qué ha perdido el error.

Tengo el código PyOpenCL con código de kernel OpenCL C. Detecto un error de segmentación cuando ejecuto mi aplicación. ¿Cómo se puede depurar ese error con algún depurador o alguna otra herramienta de desarrollo? No sé qué hacer exactamente para descubrir el problema. Tengo en mente la opción con printf o algo así, pero quiero usar cosas más potentes.

Creo que el error en el código del kernel, por lo que quiero depurar el código del kernel en primer lugar.

UPD. Estoy en Linux (Arch Linux, 3.6.11), python 2 o 3, PyOpenCl 2012.1


La depuración del Kernel es un asunto dependiente de la implementación. En Linux, lo mejor que he encontrado es usar la implementación CL de AMD en la CPU, compilar el kernel con -g y usar gdb. Ellos tienen instrucciones sobre esto en su guía de programación, aquí:

Página de documentación de AMD CL


Si está usando nvidia en lugar de la GPU ATI / AMD, la compatibilidad con OpenCL en nvidia SDK es ... inferior a la deseada.

Intel proporciona un SDK OpenCL basado en CPU para sus procesadores recientes, consulte http://software.intel.com/en-us/vcsource/tools/opencl-sdk-2013 - (para usar los paquetes RPM que proporcionan en Ubuntu, necesita ejecutar "fakeroot alien --to-deb" en cada paquete, luego "dpkg -i").

Con ese SDK, debe agregar los indicadores "-g" y "-s filename" a las opciones del compilador en build (). (Si su kernel solo existe como una cadena en su programa, puede agregar código para guardarlo en un archivo justo antes de ejecutarlo.) Luego intente con "gdb --args python-cmd", puede comenzar a depurar escribiendo "break" mykernel ", responda S cuando se le pregunte si desea esperar a que se cargue dinámicamente el símbolo" mykernel ", luego escriba" ejecutar ".

Una vez que tenga el depurador ejecutando manualmente el comando, sugiero crear un script de shell ejecutable para iniciar su archivo .py favorito con el depurador (que también será un lugar conveniente para agregar piratería al lanzamiento de su aplicación, por ejemplo, python -m unittest, PYTHONPATH, virtualenv, LD_LIBRARY_PATH, LD_PRELOAD, etc.).


La falla de segmentación generalmente se debe a un mal acceso a la memoria en su kernel. Hay una buena herramienta para detectar accesos a memoria defectuosos, similar a valgrind: https://github.com/jrprice/Oclgrind . En combinación con algunos printfs en el código kernel, hace que sea bastante más fácil localizar el problema.