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