2010-03-11 5 views
3

J'essaie Intel MKL et il semble qu'ils ont leur propre gestion de la mémoire (style C).Intel MKL gestion de la mémoire et des exceptions

Ils suggèrent d'utiliser leurs paires MKL_malloc/MKL_free pour les vecteurs et les matrices et je ne sais pas ce qui est un bon moyen de le gérer. Une des raisons en est que l'alignement de la mémoire est recommandé pour être au moins de 16 octets et avec ces routines, il est explicitement spécifié.

Je comptais beaucoup sur auto_ptr et boost :: smart_ptr pour oublier les nettoyages de la mémoire.

Comment puis-je écrire un programme de sécurité exceptionnelle avec la gestion de la mémoire MKL ou dois-je simplement utiliser auto_ptr normal et ne pas déranger?

Merci d'avance.

EDIT http://software.intel.com/sites/products/documentation/hpc/mkl/win/index.htm

ce lien peut expliquer pourquoi j'ai soulevé la question

MISE À JOUR

je une idée de la réponse ci-dessous pour allocateur. C'est ce que j'ai maintenant:

template <typename T, size_t TALIGN=16, size_t TBLOCK=4> 
class aligned_allocator : public std::allocator<T> 
{ 
public: 
pointer allocate(size_type n, const void *hint) 
{ 
    pointer p = NULL; 
    size_t count = sizeof(T) * n; 
    size_t count_left = count % TBLOCK; 
    if(count_left != 0) count += TBLOCK - count_left; 
    if (!hint) p = reinterpret_cast<pointer>(MKL_malloc (count,TALIGN)); 
    else p = reinterpret_cast<pointer>(MKL_realloc((void*)hint,count,TALIGN)); 
    return p; 
    } 
void deallocate(pointer p, size_type n){ MKL_free(p); } 
}; 

Si quelqu'un a des suggestions, n'hésitez pas à faire mieux.

+0

16- * octets * alignement, je pense. –

+0

oui, absolument vrai. Corrigée. – Andrew

Répondre

1

Vous pouvez utiliser un std::vector avec un allocateur personnalisé comme ceux mentionnés here pour assurer un alignement de 16 octets. Ensuite, vous pouvez simplement prendre l'adresse du premier élément comme pointeur d'entrée aux fonctions MKL. Il est important que vous ayez un alignement de 16 octets car MKL utilise intensivement SIMD pour les performances.

1

allouer de la mémoire à l'aide de l'opérateur C++ new [], mais réserver 15 octets supplémentaires pour l'alignement. Ensuite, créez une sorte de wrapper, qui renvoie/contient l'adresse mémoire de votre pointeur intelligent en commençant par la première limite de 16 octets. Cela produit une mémoire alignée de 16 octets.

template 
T* address16(T *address) { return (T*)((char*)address + 15) & ~0xf); } 
+0

c'est une très bonne idée. Merci! – Andrew