2016-01-12 3 views
2

Je travaille dans un environnement où j'ai besoin d'utiliser d'autres appels à malloc() et free(). Je voudrais passer des appels dans FFTW, mais si FFTW appelle en interne malloc() et free() pour ses propres besoins, il va bousiller l'environnement de gestion de la mémoire dans lequel je suis, donc j'ai besoin d'un moyen de dire à FFTW fonctions que je fournis au lieu de malloc et gratuit. Comment je fais ça?Est-ce que FFTW peut utiliser un autre malloc fourni par l'utilisateur et gratuitement?

+0

Quel allocateur voulez-vous utiliser? Beaucoup d'entre eux peuvent être activés via LD_PRELOAD. – Jeff

+0

mxMalloc/mxFree de MATLAB. Ce code doit pouvoir être compilé à la fois en tant qu'exécutable autonome et en tant que bibliothèque MATLAB MEX. Je voudrais qu'il fonctionne le plus exactement possible entre les deux situations. J'ai besoin de FFTW pour autonome; Je préférerais l'utiliser pour MATLAB MEX ainsi que pour la cohérence et la simplicité du code. –

Répondre

1

J'espère vraiment que votre compilateur mex sous-jacent est binutils gcc/GNU. Si ce n'est pas le cas, vous pourriez vouloir changer les compilateurs de mex de sorte que ce soit. Cette réponse est très spécifique à GNU ld ...

Ajouter ce qui suit au code qui est compilé avec votre mexFunction:

void * 
__wrap_malloc(size_t size) 
{ 
    return mxMalloc(size); 
} 


void 
__wrap_free(void *ptr) 
{ 
    return mxFree(ptr); 
} 


void * 
__wrap_memalign(size_t alignment __attribute__((__unused__)), size_t size) 
{ 
    return mxMalloc(size); 
} 

BTW, je suis arrivé cette liste de trois fonctions pour envelopper en faisant une objdump -T libfftw3.so, et recherche *UND* entrées pour les fonctions de gestion de tas. Ce sont les trois seuls qui sont apparus.

Maintenant, ajoutez ce qui suit à votre MEX ligne de commande:

CLIBS='-Wl,--wrap=malloc,--wrap=free,--wrap=memalign,-Bstatic,-lfftw3,-Bdynamic $CLIBS' 

En forçant l'éditeur de liens à apporter libfftw3 statiquement, il peut envelopper les appels tas spécifiés avec vos emballages personnalisés qui redirigent aux fonctions de gestion de tas de MATLAB® . Si vous vouliez être fantaisiste, vous pouvez appliquer l'alignement manuellement dans le wrapper memalign() et renvoyer un pointeur correctement aligné, mais vous devrez alors suivre chaque allocation pour annuler le changement de pointeur sur free() temps. Je suppose juste naïvement que l'allocateur de MATLAB retournera des pointeurs qui sont déjà à zéro pour l'alignement maximum utile, pensant que le besoin de MATLAB pour cela est similaire à celui de FFTW. En outre, n'oubliez pas de détruire tous vos plans et fftw_cleanup() à la sortie de votre mexFunction. MATLAB libérera tout ce que votre mexFunction (ou FFTW appelé par votre mexFunction) allouera au retour de votre mexFunction, à moins que vous ne le fassiez explicitement mexMakeMemoryPersistent().