malloc_align y free_align.

Iniciado por APOKLIPTICO, 16 Septiembre 2010, 18:26 PM

0 Miembros y 1 Visitante están viendo este tema.

APOKLIPTICO

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 (cpp) [Seleccionar]
#if defined (_WIN32)
    pos = (cl_float*)malloc_align(numBodies * sizeof(cl_float4),16);
#else
    pos = (cl_float*)memalign(16, numBodies * sizeof(cl_float4));
#endif


y
Código (cpp) [Seleccionar]
#if defined (_WIN32)
       free_align (pos);
#else
        free(pos);
#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!
AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.

Littlehorse

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
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

APOKLIPTICO

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 (cpp) [Seleccionar]
template<class T>
inline T align(T v, int N){
    return (v+(N-1)) & ~(N-1);
}

template<class T>
inline T* align_p(T* v, int N){
    return (T*)align((unsigned long)v, N);
}


void * malloc_align(size_t size,size_t alignment);

void * malloc_align(size_t size,size_t alignment)
{
    //return (char*)malloc(size+1)+1;

    if(alignment <= sizeof(void*)){
        alignment = sizeof(void*);
    }

    void* p = malloc(size + alignment);
    if(!p){
        return 0;
    }

    char* aligned = (char*)align_p(p, alignment);
    if(aligned==p){
        aligned += alignment;
    }

    *((void**)(aligned-sizeof(void*))) = p;
    return aligned;
}
AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.

Littlehorse

CitarNi en cstdlib ni en stdlib está memalign (Recordemos que estoy bajo windows).

Por supuesto que memalign no se encuentra en ninguno de esos headers si estas bajo Windows, eso ya estaba claro dadas las directivas empleadas (ifdef).

CitarEn 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
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

APOKLIPTICO

Está diseñado para VC++ 2005, no se por que no funciona bien en mingw...
AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.