GCL_MEMCPY Detección automática de los tipos de puntero -- pencl camp Relacionados El problema

gcl_memcpy auto detection of pointer types


1
vote

problema

Español

Tengo un núcleo trivial que se ejecuta en OS X que devuelve un solo int. Los bits esenciales son:

  cl_int d; cl_int* dptr = &d;  void* dev_d = gcl_malloc(sizeof(cl_int),NULL,CL_MEM_WRITE_ONLY);  // ... stuff to setup dispatch queue  dispatch_sync(queue, ^{      // ... running the kernel stuff      gcl_memcpy((void*)&d, dev_d, sizeof(cl_int));   // this gives d==0     gcl_memcpy((void*)dptr, dev_d, sizeof(cl_int)); // this gives correct d });   

La pregunta es, ¿cuál es la diferencia entre & amp; D y DPTR? Siempre he pensado en ellos como esencialmente intercambiables, pero gcl_memcpy parece estar haciendo una distinción. ¿Algunas ideas? Obviamente, puedo usar la solución DPTR, pero sigo siendo curioso lo que está sucediendo.

Original en ingles

I have a trivial kernel running on OS X that returns a single int. The essential bits are:

cl_int d; cl_int* dptr = &d;  void* dev_d = gcl_malloc(sizeof(cl_int),NULL,CL_MEM_WRITE_ONLY);  // ... stuff to setup dispatch queue  dispatch_sync(queue, ^{      // ... running the kernel stuff      gcl_memcpy((void*)&d, dev_d, sizeof(cl_int));   // this gives d==0     gcl_memcpy((void*)dptr, dev_d, sizeof(cl_int)); // this gives correct d }); 

Question is, what is the difference between &d and dptr? I've always thought of them as essentially interchangeable, but gcl_memcpy seems to be making a distinction. Any ideas? I can obviously just use the dptr solution, but I'm still curious what's happening.

  

Lista de respuestas

0
 
vote

No creo que esto tenga que ver con la llamada GCL_MEMCPY específicamente. Creo que tiene que ver con su llamada de GCD.

Cuando llame a Dispatch_Sync, su bloque obtiene una copia de las variables que usa en ella. De hecho, en situaciones similares, obtengo una advertencia de mi compilador sobre el uso y el amplificador; D en el bloque, ya que es probablemente un error común.

Por lo tanto, en su función principal, tiene una variable D en la dirección1 con el valor 0 y una variable dptr en la dirección2 con la dirección de valor1. En su bloque de despacho, tiene una variable D en la dirección3 con el valor 0 y una variable dptr en la dirección4 con la dirección de valor1. Entonces, cuando escribe en & amp; D dentro de su bloque de despacho, está poniendo el valor en la dirección3 que no verá fuera de su bloque de despacho. Cuando escribe a DPTR en su bloque de despacho, está poniendo el valor en la dirección1, que es lo que espera.

O para decirlo de otra manera, su llamada a Dispatch_Queue es como llamar a una función definida como MyFunction de vacío (CL_INT D, CL_INT * DPTR).

Si es escéptico de mi respuesta, le sugiero que intente esto con una asignación simple en lugar de la llamada GCL_MALLOC.

 

I don't think this has to do with the gcl_memcpy call specifically. I think it has to do with your GCD call.

When you call dispatch_sync, your block gets a copy of the variables you use in it. In fact, in similar situations, I get a warning from my compiler about using &d in the block, since it's probably a common mistake.

So in your main function you have a variable d at Address1 with value 0 and a variable dptr at Address2 with value Address1. In your dispatch block you have a variable d at Address3 with value 0 and a variable dptr at Address4 with value Address1. So when you write to &d within your dispatch block, you are putting the value in Address3 which you won't see outside of your dispatch block. When you write to dptr in your dispatch block, you are putting the value in Address1, which is what you expect.

Or to put it another way, your call to dispatch_queue is like calling a function defined like void myfunction(cl_int d, cl_int* dptr).

If you're skeptical of my answer, I suggest you try this with a simple assignment instead of the gcl_malloc call.

 
 

Relacionados problema

1  Transposición de OpenCl Kernel, ¿cómo se está utilizando Get_Local_ID?  ( Opencl transpose kernel how is get local id being used ) 
código tomado de una muestra. Creé un proyecto con él y funciona, pero no entiendo algunas partes. Por el bien del ejemplo, digamos que tengo una matriz de ...

3  El último controlador de OpenCl para Xeon Phi  ( Latest opencl driver for xeon phi ) 
Estoy luchando para obtener el último controlador de OpenCl para Intel Xeon Phi. Tengo una esquina de los caballeros (KNC) y solo encuentro el tiempo de ejecu...

1  CLGETPROFILINGEVENTINFO: ¿Cómo obtener información de perfil múltiple?  ( Clgetprofilingeventinfo how to get multiple profiling info ) 
Me gustaría obtener información de perfil. Mi CommandQueue ya está habilitado para perfilar. Este es mi código: status = clEnqueueNDRangeKernel( comm...

0  Cómo hacer una espera de hilo específico hasta que otros hilos calculen un valor requerido para ello en OpenCl  ( How to make a specific thread wait until other threads computes a value required ) 
Cómo bloquear un hilo específico Hasta que otros hilos calculan un valor requerido para ello en OpenCl. ...

0  ¿Cómo convertir una cadena en CL_UCHAR *?  ( How to convert a string into cl uchar ) 
¿Cómo puedo convertir (fundir) una cadena char* password = "C & OpenCL is cool"; a cl_uchar * para pasarlo a una función CL-Kernel __kernel v...

2  ¿Puede asignar un búfer que sea más grande que la memoria del dispositivo con OpenCl en una GPU  ( Can you allocate a buffer that is larger than the device memory using opencl on ) 
¿Es posible asignar un tampón que sea más grande que la memoria del dispositivo (asumiendo una GPU)? Estoy bastante seguro de esto: GameCharacter::Runnin...

2  ¿Posible escribir solo en OpenCl?  ( Possible to write only in opencl ) 
Diga que tengo un bonito algoritmo que quiero codificar para ejecutar en las CPU y las GPUs. Sé que puedo objetivo x86 con openncl . ¿Debo preparar dos ver...

0  Manera óptima de grabar datos de intersección de rayos para el rastreo de rayos utilizando OpenCl  ( Optimal way to record ray intersection data for ray tracing using opencl ) 
Estoy desarrollando un trazador de Monte Carlo Ray en OpenCL para calcular 'Ver factores' para el análisis de transferencia de calor radiativo y desea saber l...

1  Declaraciones de estructura de OpenCl en diferentes espacios de memoria  ( Opencl structure declarations in different memory spaces ) 
En OPENCL, cuáles serán las consecuencias y las diferencias entre las siguientes declaraciones de estructuras. Y si son ilegales, ¿por qué? struct gr_array...

3  Programación de la CPU de GPU vs: inconsistencias en los tiempos de procesamiento  ( Gpu vs cpu programming inconsistencies in processing times ) 
Actualmente estoy trabajando en el seguimiento de la imagen: Gracias a una cámara, estoy rastreando los toques de los dedos que interactúan con un sistema And...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos