Quel est le maximum théorique de vitesse en raison de l'ESS pour une soustraction binaire simple?

StackOverflow https://stackoverflow.com/questions/1466907

Question

En essayant de comprendre si la boucle intérieure ou non mon code frappe une barrière de conception matérielle ou d'un manque de compréhension de ma barrière partie. Il y a un peu plus à lui, mais la question la plus simple que je peux trouver pour répondre est la suivante:

Si j'ai le code suivant:

float px[32768],py[32768],pz[32768];
float xref, yref, zref, deltax, deltay, deltaz;

initialize_with_random(px);
initialize_with_random(py);
initialize_with_random(pz);

for(i=0;i<32768-1;i++) {
  xref=px[i];
  yref=py[i];
  zref=pz[i];
  for(j=0;j<32768-1;j++ {
    deltx=xref-px[j];
    delty=yref-py[j];
    deltz=zref-pz[j];
  } }

Quel type jusqu'à la vitesse théorique maximale que je serais en mesure de voir en allant aux instructions SSE dans une situation où j'ai un contrôle complet sur le code (montage, intrinsics, peu importe), mais aucun contrôle sur l'environnement d'exécution autre que l'architecture (il est un environnement multi-utilisateur je ne peux pas faire quoi que ce soit sur la façon dont le noyau de système d'exploitation affecte le temps de mon processus particulier).

En ce moment, je vois un haut vitesse de 3x avec mon code, quand je l'aurais pensé à l'aide SSE me donnerait beaucoup plus de profondeur de vecteur à la vitesse de 3 x up est indiquant (probablement la vitesse de 3x jusqu'à me dit que j'ai 4x de débit théorique maximum). (Je l'ai essayé des choses telles que de laisser deltx / delty / deltz être des tableaux dans le cas où le compilateur était pas assez intelligent pour les auto-promotion, mais je vois encore que jusqu'à 3 fois la vitesse.) J'utilise le compilateur C intel avec les drapeaux du compilateur appropriés pour vectorisation, mais pas intrinsics évidemment.

Était-ce utile?

La solution

Cela dépend de la CPU. Mais le maximum théorique ne sera pas obtenir au-dessus 4x. Je ne sais pas d'un CPU qui peut exécuter plus d'une instruction SSE par cycle d'horloge, ce qui signifie qu'il peut au plus Compute 4 valeurs par cycle.

La plupart des CPU peuvent faire au moins un à virgule flottante scalaire par cycle, donc dans ce cas, vous verriez un maximum théorique d'un SpeedUp 4x.

Mais vous devez regarder le débit d'instructions spécifiques pour le CPU que vous utilisez sur.

Une pratique de 3x speedup est assez bonne.

Autres conseils

Je pense que vous auriez probablement entrelacer en quelque sorte la boucle intérieure. Le vecteur 3 composants se fait, à la fois, mais c'est seulement trois opérations à la fois. Pour arriver à 4, vous feriez 3 composants du premier vecteur et 1 de la suivante, puis 2 et 2, et ainsi de suite. Si vous avez établi une sorte de file d'attente qui charge et traite les données 4 composants à la fois, puis séparer après, qui pourrait fonctionner.

Edit: Vous pouvez déroulez la boucle interne pour faire 4 vecteurs par itération (en supposant que la taille du tableau est toujours un multiple de 4). Ce serait accomplir ce que je l'ai dit ci-dessus.

Considérez: Quelle est la largeur d'un flotteur? Quelle est la largeur de l'instruction SSEx? Le rapport devrait devrait vous donner une sorte de limite supérieure raisonnable.

Il est également intéressant de noter que les tuyaux hors-jeu pour Havok à obtenir de bonnes estimations de speedup.

Vous devriez considérer - la façon dont vous accédez à des valeurs dans la boucle interne est causant probablement beaucoup de raclée dans le cache de données L1. Il est pas trop mal, car tout probablement se glisse dans la L2 à 384 Ko, mais il est facilement un ordre de grandeur de différence entre un coup de cache L1 et un succès de cache L2, alors cela pourrait faire une grande différence pour vous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top