J'ai un tableau 3d contenant la boîte englobante non cubique d'une géométrie clairsemée.Courbe de Hilbert 3D pour une géométrie clairsemée
La géométrie de la matrice [x] [y] [z] contient la valeur 0 si (x, y, z) est située dans le domaine de calcul et sinon 1.
Dans une tentative pour réorganiser les calculs Je souhaite aime parcourir cet espace en utilisant une courbe de Hilbert.
Le contexte optimise l'accès global à la mémoire dans un programme GPU lié à la mémoire.
Comment puis-je l'implémenter?
Mise à jour: Je veux juste traverser les cellules non vides, comme je ne conserverons les (dans un tableau), avec une liste de contiguïté qui garde la trace de 19 noeuds voisins d'un élément.
Le calcul est simple copie entre deux réseaux:
dst[i] = src[adjacency_map[i]]
Ceci est la phase de propagation d'un procédé clairsemé Lattice Boltzmann, où l'interprétation physique est streaming « » particules de fluide à partir d'un site voisin.
Plus les valeurs dans adjacency_map sont séquentielles; les accès à la mémoire plus coalesced, nous l'espérons.
noyau OpenCL:
__kernel void propagation(__global double *dst, __global double *source,
__global const int *adjacency_map, const uint max_size)
{
size_t l = get_global_id(0);
if(l > max_size)
return;
dst[l] = src[adjacency_map[l]];
}
voulez-vous parcourir ** toutes ** les cellules du volume, ou seulement les cellules non vides? Quel calcul souhaitez-vous appliquer aux cellules? –
Je veux traverser uniquement les cellules non vides car elles seront stockées plus tard dans un tableau. J'ai mis à jour la question originale avec quelques informations supplémentaires. – kyrre