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:
#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
#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!
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
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:
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;
}
CitarNi 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).
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
Está diseñado para VC++ 2005, no se por que no funciona bien en mingw...