Question

J'utilise des extensions SSE disponibles dans le processeur Core2Duo (gcc compilateur 4.4.1). Je vois qu'il ya 16 registres disponibles dont chacun est 128 peu long. Maintenant, je peux accueillir 4 valeurs entières dans un seul registre, et 4 dans un autre registre et à l'aide que je peux les intrinsics ajouter dans une instruction. L'avantage évident est cette façon, je ne requiers 1 instruction au lieu de 4.

Ma question est "est que tout pour SIMD?". Soit I ai a1, a2, a3, a4, a5, a6, a7, a8 et b1, b2, b3, b4, b5, b6, b7, b8. Soient A1, A2 sont des registres vectoriels. Maintenant, A1 <<< (a1, a2, a3, a4) et B1 <<< (b1, b2, b3, b4), et ajouter (A1, B1) seront effectuer l'addition vectorielle.

Soit A2 <<< (a5, a6, a7, a8), B2 <<< (b5, b6, b7, b8). Y at-il une instruction d'ajout qui peut faire ajouter (A1, B1) et ajouter (A2, B2) simultanément.

Combien d'unités fonctionnelles vecteur sont disponibles dans Core2Duo et où puis-je obtenir ces informations?

Toute autre source d'informations liées à ces derniers est très apprécié.

Était-ce utile?

La solution

  • Non, il n'y a aucune instruction SSE simple à faire. Vous devez émettre deux instructions. Pensez-vous à quelque chose comme les instructions de chaîne x86 et le préfixe REP? Il n'y a pas équivalent SSE.

  • Les deux opérations de vecteur 4 à l'échelle être exécuté concerrently dans le sens où tous les processeurs modernes sont très pipelinées. La deuxième instruction va descendre le tuyau seulement 1 cycle derrière la première (en supposant les deux ne sont pas interdépendants, ce qui est le cas dans votre exemple), de sorte que leur exécution se chevauchent dans le temps, sauf pour ce cycle un.

  • Chaque core de votre processeur multi-core dispose de sa propre unité fonctionnelle de vecteur. Vous devez écrire du code multithread pour tirer profit de cela.

  • Certains ont CPUs 1 unité de vecteur par cœur, certains ont seulement 1/2! Dans ce dernier cas, l'unité de vecteur est de seulement 64 bits de large et exécute seulement la moitié de l'instruction SSE à la fois. Vous obtenez ce que vous payez.

  • Vous devriez regarder dans AVX, la nouvelle extension du jeu d'instructions SSE qui évolue pour appuyer les unités de vecteur plus larges.

  • Ou vous pouvez regarder en programmation vectoriel réel sur un GPU OpenCL ou Cuda.

Autres conseils

Je ne pense pas qu'il y ait une seule instruction de le faire (à moins qu'ils ne se sont faufilés dans une version récente de l'ESS).

Cependant, les opérations que vous faites sont indépendants, le compilateur peut émettre la deuxième instruction d'ajouter avant que la première se termine. Ainsi, la chronologie ressemblerait à quelque chose comme

begin C1 = A1 + B1
begin C2 = A2 + B2
wait
end C1 = A1 + B1
end C2 = A2 + B2

Ainsi, même si vous utilisez deux instructions, vous prenez pas nécessairement deux fois le temps. La durée réelle de l'attente dépendra du processeur et le temps d'attente de l'instruction particulière que vous utilisez.

Voici une explication plus détaillée de pipelining: http://en.wikipedia.org/wiki/Instruction_pipeline

Pour de l'aide sur la programmation SIMD en général, la page d'Apple SSE est assez bien. Il est un peu orienté vers les applications de PowerPC migration à SSE, mais il y a quelques bonnes informations générales aussi.

Le site contient intel toutes les informations dont vous aurez besoin!

http://www.intel.com/products/processor/manuals/

Modifier en réponse au commentaire: Toutes les informations sont dans les liens ci-dessus, mais liés à Non Vous pouvez emballer 8 entiers de 16 bits dans 1 registre et ainsi effectuer 8 ajoute simultanément, mais pas SSE ne permet pas d'ajouter 2 registres simultanément.

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