es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

OpenCL clCreateProgramFromSource() falla con un segfault en la dirección de una única cadena incluida.

Llamando a clCreateProgramFromSource en una fuente única con el argumento strings establecido en la dirección de un array de caracteres incluido segfaults, pero pasar el array como elemento de un array de punteros a caracteres funciona.

#include "prog_src.h"
const char *cl_srcs[1];
cl_srcs[0] = prog_src_cl;

cl.prog = clCreateProgramWithSource(cl.context, 1, cl_srcs, NULL, &err);
puts("test0");
cl.prog = clCreateProgramWithSource(cl.context, 1, &prog_src_cl, NULL, &err);
puts("test1");

Se imprimirá “test0” y luego el programa se bloqueará, no estoy seguro de por qué no funciona en la segunda versión, progsrccl es un unsigned char * en el archivo incluido.

Cualquier ayuda sería muy apreciada ya que no puedo entender por qué algo aparentemente trivial no funciona como se esperaba.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Basado en el fragmento de código proporcionado, parece que pasar la dirección del arreglo de caracteres #incluido directamente como argumento a clCreateProgramWithSource() resulta en una violación de segmento, mientras que pasarlo como un elemento de un arreglo de puntero a caracteres funciona correctamente.

    Una posible explicación para este comportamiento está relacionada con el diseño de la memoria del archivo incluido. Si el archivo “prog_src.h” contiene definiciones o declaraciones que afecten la representación binaria del arreglo incluido, el diseño resultante de la memoria al incluir el archivo directamente podría ser diferente del diseño al acceder a los mismos datos a través de un puntero almacenado en una variable separada.

    Para investigar más este problema, sería útil examinar el contenido del archivo “prog_src.h”, así como cualquier opción de compilador o enlazador relevante que pueda afectar el diseño de la memoria del programa. También podría ser útil experimentar con diferentes formas de acceder a los mismos datos, como usar memcpy() para copiar el contenido del arreglo en un búfer separado antes de pasarlo a la API de OpenCL.

Comments are closed.