0

J'utilise un moteur qui permet d'écrire du code SIMD, et il fonctionne rapidement. Mais il n'y a qu'un seul bloc qui a tout le code.Comment se comporte le SIMD dans ce cas?

Je comprends que ce code est exécuté indépendamment sur chaque entité simultanément, mais quand il n'y a qu'un seul changement, est-il encore plus rapide de le calculer indépendamment? Est-ce l'idée avec SIMD, parallélisme?

Par exemple:

void simdFunction() 
{ 
    center = mesh.center(); // always the same 
    vert.pos.x = center.x; // run on each vertex 
} 

Dans ce cas, le centre est toujours le même, il en sera calculé pour chaque sommet sur SIMD? Si oui, est-ce encore efficace?

Fondamentalement est-ce que le fait de pouvoir exécuter cela en parallèle l'emporte sur le coût de calcul, quel que soit le sens général de la programmation SIMD?

Répondre

4

ce code est exécuté indépendamment sur chaque entité simultanément

Non, ce n'est pas comment fonctionne SIMD. Avec SIMD, toutes les unités arithmétiques travaillent en mode verrouillage et effectuent des opérations identiques. Il n'y a aucune indépendance. Cependant, en général, il vaut mieux calculer les constantes partagées qu'une seule fois, en code séquentiel. De cette façon, le moteur SIMD passera moins de temps sur chaque tranche de sommets. L'exception serait que si le calcul est court, le SIMD est un coprocesseur (comme GPGPU), et les données sont déjà dans ce coprocesseur. Ensuite, en le calculant en utilisant SIMD pourrait facilement battre les données de déplacement vers le processeur séquentiel et retour.

+0

Merci Ben, il me semble mieux comprendre maintenant. Mais je n'ai pas de contrôle sur ça. La spécification du moteur définit que je ne peux avoir qu'un seul contexte SIMD. Je peux écrire d'autres fonctions, etc. mais dès que je les appelle dans le contexte principal, ce sera la même chose. Donc je suppose que je n'ai pas le choix. –