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.