2011-07-18 26 views
5

Soy nuevo en OpenCL. He trabajado con kernel OpenCL con datos 1-D. Pero cuando traté de pasar un puntero tridimensional, no pude construir el kernel. Para ser específico me estoy poniendo CL_BUILD_PROGRAM_FAILURE. Aquí está el pseudo código para el kernel que estoy tratando de construir -¿Cómo usar una matriz 3-D en el kernel OpenCL?

__kernel void 3D_Test(__global float ***array) 
{ 

x = get_global_id(0); 
y = get_global_id(1); 
z = get_global_id(2); 

array[x][y][z] = 10.0; 

} 

Podría alguien darme una idea de lo que está mal con el código? ¡Gracias por adelantado!

+0

debe comprobar el registro de generación, lo consigue con clGetProgramBuildInfo. –

+0

También podría echarle un vistazo al tipo Image3D, compatible con OpenCL 1.1, que le permite almacenar y pasar matrices 3D con bastante facilidad. –

Respuesta

5

Eso no es válido OpenCL C (es por eso que no compila), para una matriz 3D, tendrá que usar una versión linearizada de esa matriz, simplemente cree una matriz normal de tamaño apropiado (sizeX * sizeY * sizeZ) y el índice de esta manera:

int index = x + y * sizeX + z * sizeX * sizeY; 

Otra opción es utilizar una imagen 3D con clCreateImage3D

+0

@ Matias ... muchas gracias por su ayuda. ¡Funcionó! – andromida

0

Tendrás primero para asegurarse de alguna manera su matriz como espacio suficiente, a todos los niveles ...

¿Cómo se declara o se asigna la matriz?

+0

Editaré la respuesta cuando obtenga una respuesta, por lo que debería ser una «real» ...:) – Macmade

+0

@ Macmade ... Las he asignado en el código de host. Pero me preguntaba si se trata de utilizar un arreglo 3-D en Kernel. Debido a que el mismo código cuando paso '* array' y uso 'array [x] = 10', no hay ningún problema con la compilación. ¿Hay algo mal con la sintaxis? No pude encontrar un exaven con una matriz 3-D en OpenCL. – andromida

+0

Para ser específico, recibo el error 'CL_BUILD_PROGRAM_FAILURE' :( – andromida

Cuestiones relacionadas