11.3.3.1.1 : Données contiguës


Nous avons vu dans lasection 11.2.2.2 que l'utilisation de données contiguës est nécessaire pour que les échanges entre la CPU et la RAM soient efficaces. La contiguïté des données joue aussi un rôle crucial en calcul vectoriel.

En effet, les instructions vectorielles ne peuvent généralement être appliquées qu'à des données jointives en mémoire. Ce qui pose problème lorsqu'on stocke les données sous formes de tableaux de structures, comme il est intuitif de le faire en C ou en C++.

Par exemple, dans un tableau de vecteurs tridimensionnels, les coordonnées des vecteurs se retrouveront stockées en mémoire dans l'ordre $X_1$ , $Y_1$ , $Z_1$ , $X_2$ , $Y_2$ , $Z_2$ ,~etc. Il ne sera donc pas possible d'effectuer des opérations vectorielles sur les coordonnées X des vecteurs, car celles-ci ne sont pas stockées de façon contiguë en mémoire.

Pour éviter ce problème, il est souvent nécessaire de remplacer les tableaux de structures par des structures de tableaux (voir figure 38).

On conçoit aisément que cette organisation des données va à l'encontre des pratiques usuelles de programmation orientée objet, et qu'un format de données qui a été développé avec trop de classes imbriquées ne permettra pas une vectorisation directe des calculs.

Dans ce cas, les données devront être copiées dans des structures qui permettent la vectorisation. Or, cette copie a un coût, aussi bien en temps qu'en mémoire, ce qui amoindrira l'accélération due à la vectorisation voire rendra celle-ci inutilisable.

nothing

Figure 38 : Accès aux données dans les structures de tableaux et tableaux de structures.