Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: APOKLIPTICO en 16 Septiembre 2010, 18:26 pm



Título: malloc_align y free_align.
Publicado por: APOKLIPTICO en 16 Septiembre 2010, 18:26 pm
Hola gente, como va todo?
Estoy jugando un poco con la tecnología opencl y atistream, y entonces, me puse a tratar de adaptar un sample de Nbody, muy interesante que viene con el SDK a mi IDE code::blocks + Mingw. Pero me encontré con algunos problemas, cuando pude resolver todos los problemas del linker, me encontré con estos pedazos de código:
Código
  1. #if defined (_WIN32)
  2.    pos = (cl_float*)malloc_align(numBodies * sizeof(cl_float4),16);
  3. #else
  4.    pos = (cl_float*)memalign(16, numBodies * sizeof(cl_float4));
  5. #endif

y
Código
  1. #if defined (_WIN32)
  2.       free_align (pos);
  3. #else
  4.        free(pos);
  5. #endif

No pude encontrar los includes que funcionan con codeblocks + mingw, entonces pensé si era posible usar los operadores "new" y "delete" para allocar la memoria. Pero despues de probar varias formas, decidí pedir ayuda.
Alguien sabe cual es el include que funciona con esto, o como adaptarlo para que funcione con "new" y "delete"??
Muchas gracias!


Título: Re: malloc_align y free_align.
Publicado por: Littlehorse en 16 Septiembre 2010, 22:14 pm
Primero que nada, se supone que si estas utilizando memalign es para garantizar que el alineamiento que planteas va a ser respetado, por esa misma razón no estas usando ni new ni malloc. Dado eso, seria imprudente hacer los cambios que planteas.

Por otro lado, el tema de los includes, cstdlib/stdlib.h para memalign/free. Para malloc_align y free_align, busca en la documentación del SDK que debería estar todo lo necesario.

Saludos


Título: Re: malloc_align y free_align.
Publicado por: APOKLIPTICO en 17 Septiembre 2010, 00:18 am
Ni en cstdlib ni en stdlib está memalign (Recordemos que estoy bajo windows).
En cuanto al SDK, de que SDK estás hablando???
El único SDK que encontré es en el de CELL, pero no necesito el SDK de CELL, y no me lo voy a bajar entero solo para una funcion...
Si estás hablando del SDK de ati stream, lo revisé pero malloc_align no está definido en ningun lado...

Bueno, despues de búsquedas interminables de google, pude robar el malloc_align de un código que estaba tirado por ahi, pero no está en el SDK de opencl ni el de stream..
Es extrañisimo, pero bueno, ya lo hice compilar y está funcionando bien.

Por si alguien lo llegase a necesitar:
Código
  1. template<class T>
  2. inline T align(T v, int N){
  3.    return (v+(N-1)) & ~(N-1);
  4. }
  5.  
  6. template<class T>
  7. inline T* align_p(T* v, int N){
  8.    return (T*)align((unsigned long)v, N);
  9. }
  10.  
  11.  
  12. void * malloc_align(size_t size,size_t alignment);
  13.  
  14. void * malloc_align(size_t size,size_t alignment)
  15. {
  16.    //return (char*)malloc(size+1)+1;
  17.  
  18.    if(alignment <= sizeof(void*)){
  19.        alignment = sizeof(void*);
  20.    }
  21.  
  22.    void* p = malloc(size + alignment);
  23.    if(!p){
  24.        return 0;
  25.    }
  26.  
  27.    char* aligned = (char*)align_p(p, alignment);
  28.    if(aligned==p){
  29.        aligned += alignment;
  30.    }
  31.  
  32.    *((void**)(aligned-sizeof(void*))) = p;
  33.    return aligned;
  34. }


Título: Re: malloc_align y free_align.
Publicado por: Littlehorse en 17 Septiembre 2010, 00:47 am
Citar
Ni en cstdlib ni en stdlib está memalign (Recordemos que estoy bajo windows).

Por supuesto que memalign (http://www.delorie.com/gnu/docs/glibc/libc_31.html) no se encuentra en ninguno de esos headers si estas bajo Windows, eso ya estaba claro dadas las directivas empleadas (ifdef).

Citar
En cuanto al SDK, de que SDK estás hablando???

Al SDK que bajaste. Si el código es un ejemplo del SDK, seria curioso que contenga funciones que no estén definidas en ningún lado sin aclararlo como mínimo en los comentarios, pero en fin, me alegro que lo hayas solucionado.

Saludos


Título: Re: malloc_align y free_align.
Publicado por: APOKLIPTICO en 17 Septiembre 2010, 04:08 am
Está diseñado para VC++ 2005, no se por que no funciona bien en mingw...