L'Allocation dynamique de la mémoire Constante dans CUDA
Je suis en train de prendre avantage de la constante de mémoire, mais je vais avoir un moment difficile de déterminer comment imbriquer des tableaux. Ce que j'ai est un tableau de données qui a des comptes pour les données internes mais ceux-ci sont différents pour chaque entrée. Donc, autour de l'simplifiée suivante de code, j'ai deux problèmes. D'abord je ne sais pas comment répartir les données pointées par les membres de ma structure de données. Deuxièmement, étant donné que je ne peux pas utiliser cudaGetSymbolAddress constant de mémoire, je ne suis pas sûr si je peux juste passer le pointeur global (vous ne pouvez pas faire avec la plaine __device__ la mémoire).
struct __align(16)__ data{
int nFiles;
int nNames;
int* files;
int* names;
};
__device__ __constant__ data *mydata;
__host__ void initMemory(...)
{
cudaMalloc( (void **) &(mydata), sizeof(data)*dynamicsize );
for(int i=; i lessthan dynamicsize; i++)
{
cudaMemcpyToSymbol(mydata, &(nFiles[i]), sizeof(int), sizeof(data)*i, cudaMemcpyHostToDevice);
//...
//Problem 1: Allocate & Set mydata[i].files
}
}
__global__ void myKernel(data *constDataPtr)
{
//Problem 2: Access constDataPtr[n].files, etc
}
int main()
{
//...
myKernel grid, threads (mydata);
}
Merci pour toute aide offerte. 🙂
OriginalL'auteur Ben | 2008-11-07
Vous devez vous connecter pour publier un commentaire.
Ces deux threads devrait vous aider:
http://forums.nvidia.com/index.php?showtopic=30269&hl=embedded
OriginalL'auteur 0fnt
Je pense constante de la mémoire est de 64 ko et vous ne pouvez pas allouer de façon dynamique à l'aide de CudaMalloc. Il doit être déclarée constante, disons,
De même, vous aussi n'avez pas besoin de le libérer. Aussi, vous ne devriez pas passer la référence à celui-ci via pointeur, il suffit d'accéder comme une variable globale. J'ai essayé de faire une chose semblable et il m'a donné une erreur de segmentation (en devicemu).
OriginalL'auteur
Non, tu ne peux pas faire cela.
Constante de la mémoire (64 KO max) ne peut être codé en dur avant la compilation.
Cependant, vous pouvez affecter la mémoire de texture sur la volée, ce qui est également mis en cache sur l'Appareil.
OriginalL'auteur jwdmsd
Pourquoi ne pas simplement utiliser la soi-disant "paniers" de la représentation des données? Cette approche vous permet de placer toutes les données dont vous avez besoin dans une dimension de tableau d'octets. E. g., si vous avez besoin de stocker
Vous pouvez simplement stocker ces données dans le tableau de cette façon:
OriginalL'auteur