Bonjour,Je souhaiterais modifier le comportement d'un code déjà écrit (celui des classes utilitaires de la bibliothèque d'imagerie NPP utilisant CUDA ). Mon problème est qu'il utilise des classes templates :
- Image
- ImagePacked héritant de Image (ImagePacked.h)
- ImageCPU héritant de ImagePacked (ImagesCPU.h)
- ImageNPP héritant de ImagePacked
- AllocatorCPU utilisée dans ImagePacked (ImageAllocatorsCPU.h)
- AllocatorNPP utilisée dans ImagePacked
Les constructeurs et destructeur de imageCPU utilisent les méthodes de la classe (ici le terme structure serait surement plus approrié) AllocatorCPU par le biais de la classe ImagePacked pour allouer et désalouer les pixels des instances de imageCPU (de même avec *****NPP). Or, pour le cas d'imageCPU, je souhaiterais pouvoir choisir le type de mémoire allouée (non paginée ou paginée) en utilisant les fonctions adéquates (resp. malloc (ou new) et cudaMallocHost) puis les désalouer avec la bonne fonction (resp. free (ou delete) OU cudaFreeHost). Pour l'instant, c'est la mémoire non paginée qui est utilisée.
L'idée serait donc d'introduire un paramètre extérieur définissant le type de mémoire à utiliser et de le conserver jusqu'à la désalocation.
Comment puis-je faire sans trop modifier le code ?
Merci d'avance pour toute réponse,
Roll'Froy
ImagePacked.h
ImagesCPU.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 namespace npp { ... template<typename D, size_t N, class A> class ImagePacked: public npp::Image { public: ... ImagePacked(unsigned int nWidth, unsigned int nHeight): Image(nWidth, nHeight) , aPixels_(0) , nPitch_(0) { aPixels_ = A::Malloc2D(width(), height(), &nPitch_); } virtual ~ImagePacked() { A::Free2D(aPixels_); } ... private: D * aPixels_; unsigned int nPitch_; }; } // npp namespace
ImageAllocatorsCPU.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 namespace npp { template<typename D, size_t N, class A> class ImageCPU: public npp::ImagePacked<D, N, A> { ... }; typedef ImageCPU< Npp8u, 1, npp::AllocatorCPU<Npp8u,1> > ImageCPU_8u_C1; ... } // npp namespace
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 namespace npp { template <typename D, size_t N> class AllocatorCPU { public: static D * Malloc2D(unsigned int nWidth, unsigned int nHeight, unsigned int * pPitch) { NPP_ASSERT(nWidth * nHeight > 0); D * pResult = new D[nWidth * N * nHeight]; *pPitch = nWidth * sizeof(D) * N; return pResult; }; static void Free2D(D * pPixels) { delete[] pPixels; }; }; } // npp namespace
Partager