Bonjour,
J'ai pour projet de faire un addon a CUDA.
Un gestionnaire de m�moire permettant de minimiser les transfert et de les faciliter.
Exemple d'utilisation :
Jusqu'ici impl�mentation fut simple, mais ce n'est pas assez.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5 coherant_block<int> block(new int); block = 4; changeValue<<<1,1>>>(block.gpu()); // la valeur est la même sous le GPU et CPU
Le probl�me de d�part est toujours la, les transfert sont toujours pr�sent est lent.
J'ai donc eu l'id�e de faire des memory modifiers.
En gros l'id�e est de ne pas renvoyer toute la m�moire mais de renvoyer des block qui vont modifier la m�moire qui a chang� sur le CPU ou le GPU.
Par exemple j'ai un tableau de 10 000 int mais seulement un a �t� modifi� ; avec le fonctionnement standard il faudrait copier la totalit� de la m�moire donc 9 999 copie inutiles. A l'aide des memory modifiers il n'y aurait "que" 12 octets de transfert.
Avec ceci viendrait le count qui donnerait combien de block ont �t� modifi�.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5 struct memory_modifier { int offset; void* data; };
Grace a ce proc�d� il serait donc possible avec plusieurs optimisation "on the fly" de r�duire la latence GPU <-> CPU de fa�on consid�rable.
Donc revenons en au fait, pourquoi poster ?
En fait je n'arrive pas a trouver une facon propre de d�tecter si la fonction est __host__ __device__ ou __global__, ce qui limite mon syst�me a avoir toute la partie CPU compil� par le compilateur VS ou Intel et tout le GPU sur nvcc et rend donc le code peu compr�hensible.
Actuellement je fais sois des defines soit un syst�me de condition g�rer dans la classe.
Voila, je pr�cise que le memory manager sera aussi atomic sur le CPU.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9 // call the cuda func test<<<64,64>>>(myBlock.gpu()); myBlock.enterCPUCycles(); // the func __global__ void test(coherant_block<int>* block) { // do some work }
Merci d'avance.
Partager