Comment utiliser la mémoire constante pour les débutants (Cuda C)

J’ai 3 valeurs constantes ( A , B , C ) que je voudrais enregistrer dans la mémoire constante; J’ai trouvé une façon de le faire en tapant cette ligne de code:

 // CUDA global constants __constant__ int A; __constant__ int B; __constant__ int C; int main(void) { float pA=1; float pB=2; float pC=3; ... cudaMemcpyToSymbol(A, &pA, sizeof(A)); cudaMemcpyToSymbol(B, &pB, sizeof(B)); cudaMemcpyToSymbol(C, &pC, sizeof(C)); ... } 

Cependant, j’estime que ce n’est pas la meilleure façon de procéder car cela deviendrait très gênant si j’avais un plus grand nombre de constantes.

Voici ma question : comment puis-je reproduire les lignes de code que j’ai écrites ci-dessus afin d’avoir une forme plus compacte?

La mémoire constante dans CUDA est un espace mémoire dédié de 65 536 octets. Il est dédié car il possède des fonctionnalités spéciales telles que le cache et la diffusion.

L’espace mémoire constant réside dans la mémoire du périphérique et est mis en cache dans le cache constant mentionné dans Compute Capability 1.x et Compute Capability 2.x.

Voir Sect. 5.3.2. Accès à la mémoire de l’appareil et Sect. G.4.4. Mémoire constante dans le Guide de programmation CUDA C pour plus de détails.

Ainsi, vous pouvez allouer de la mémoire constante pour un élément comme vous l’avez déjà fait, et vous pouvez également allouer de la mémoire pour un tableau d’éléments.

 __constant__ float c_ABC[3]; // 3 elements of type float (12 bytes) 

Toutefois, l’allocation dynamic de mémoire constante n’est pas autorisée dans CUDA. Par conséquent, vous devez copier les données de la CPU vers le GPU comme vous l’avez fait avec un élément.

 float pABC = {1, 2, 3}; ... cudaMemcpyToSymbol(c_ABC, &pABC, 3 * sizeof(float)); 

Vous pouvez initialiser pABC dans la CPU, par exemple dans une boucle ou charger des données depuis un fichier, puis copier les données dans la mémoire constante du GPU.

Notez que j’ai ajusté votre exemple pour utiliser toujours des flottants.