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 :
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
Jusqu'ici implémentation fut simple, mais ce n'est pas assez.
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
struct memory_modifier
{
int offset;
void* data;
};
Avec ceci viendrait le count qui donnerait combien de block ont été modifié.
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.
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
}
Voila, je précise que le memory manager sera aussi atomic sur le CPU.

Merci d'avance.