écrit devant
- Si une image ne se charge pas, veuillezsciences en ligne。
- Le texte complet est résumé par les points clés de l'examen donné par M. Liu de l'École du logiciel.Il
devraitcouvrir tous les sites de test et n'est qu'à titre de référence. (Merci Maître Liu !)- Mise à jour du 30 mai 2023 : Tout le contenu du test est dans le plan de révision. Si vous le mémorisez bien, vous devriez pouvoir obtenir une bonne note. Merci encore, Professeur Liu !
Annuaire d'articles
- Traitement en parallèle
-
- 1. Multiplication matrice-vecteur
- 2. Problème de fonctionnement MPI_Reduce()
- 3. Questions d'interprétation SISD, SIMD
- 4. Problème d'accès au cache du cache
- 5. Questions de calcul de chaîne de montage
- 6. Question de division des données MPI
- 7. Communication point à point et questions-réponses
- 8. Problème de cohérence du cache
- 9. Problème de dépendance circulaire
- 10. Problème de définition de macro OpenMP
- 11. CUDA calcule des vecteurs unidimensionnels et des problèmes de calcul
- 12. CUDA vecteur bidimensionnel et problèmes de calcul
- 13. Multiplication matricielle bidimensionnelle CUDA
- 14、Réduction CUDA
Traitement en parallèle
1. Multiplication matrice-vecteur
sujet
numéro de série
Répondre
Pthreads code divisible
![](https://raw.githubusercontent.com/ma2607219640/picb/main/img/%E7%9F%A9%E9%98%B5%E5%90%91%E9%87%8F%E4%B9%98pthreads%E6%95%B4%E9%99%A4.png)
Pthreads calcul non divisible
Remarque : Le code donné par l'enseignant est n/p, mais le paramètre de sujet est m, t, doncLes n et p suivants doivent être remplacés par m et t, c'est-à-dire:
quotient = m / t;
remainder = m % t;
2. Problème de fonctionnement MPI_Reduce()
sujet
![Sujet MPI](https://raw.githubusercontent.com/ma2607219640/picb/main/img/image-20230527175705903.png)
répondre
Si le processus 0 est le processus cible, après la fin de l'exécution,b= 1 + 2 + 1 = 4 ;d= 2 + 1 + 2 = 5 ;
Si le processus 1 est le processus cible, après la fin de l'exécution,d= 1 + 2 + 1 = 4 ;b= 2 + 1 + 2 = 5 ;
3. Questions d'interprétation SISD, SIMD
sujet
L'ajout de cache et de mémoire virtuelle à un système von Neumann change-t-il son type en tant que système SISD ? Qu'en est-il des pipelines ? Multi-issue ou multi-threading matériel ?
Répondre
Les implémentations les plus élémentaires du cache et de la mémoire virtuelle ne modifient pas le nombre d'instructions pouvant être exécutées simultanément ni la quantité de données pouvant être manipulées.
Nous pouvons considérer le pipelining comme l'application d'une instruction complexe à plusieurs éléments de données. En tant que tel, il est parfois considéré comme un type de SIMD.
Plusieurs problèmes et le multithreading matériel tentent d'appliquer des instructions éventuellement différentes à différents éléments de données. Par conséquent, ils peuvent être considérés comme des exemples de MIMD.
4. Problème d'accès au cache du cache
sujet
Répondre
Étant donné que le langage C est stocké dans l'ordre des lignes principales, l'accès ligne par ligne est plus rapide.
La boucle interne de la première double boucle for est accessible par ligne, avec un taux de réussite du cache élevé et une vitesse plus rapide ;
La boucle interne de la deuxième double boucle for est accessible par colonne, le taux de réussite du cache est faible et la vitesse est plus lente.
5. Questions de calcul de chaîne de montage
sujet
Répondre
première question
2+1+1+1+1+1+2 = 9ns
deuxième question
9 × \ fois× 1000 = 9000ns
troisième question
TEMPS | récupérer les instructions | Comparer | changement | additionner | normaliser | inclus | stockage |
---|---|---|---|---|---|---|---|
0 | 0 | ||||||
1 | 0 | ||||||
2 | 1 | 0 | |||||
3 | 1 | 0 | |||||
4 | 2 | 1 | 0 | ||||
5 | 2 | 1 | 0 | ||||
6 | 3 | 2 | 1 | 0 | |||
7 | 3 | 2 | 1 | 0 | |||
8 | 4 | 3 | 2 | 1 | 0 | ||
9 | 4 | 3 | 2 | 1 | |||
dix | 5 | 4 | 3 | 2 | 1 | ||
11 | 5 | 4 | 3 | 2 | |||
12 | 6 | ··· | 4 | 3 | 2 | ||
13 | 6 | ··· | 4 | 3 |
7 + (1000 × \fois× 2) = 2007 ns
6. Question de division des données MPI
partition de bloc, partition de boucle, partition de cycle de bloc
sujet
12 tâches, 3 fils, comment diviser en trois types ?
14 tâches, 3 fils, comment diviser en trois types ?
Répondre
1,
2、
Processus | pièce | Suivre | anneau | pièce | - | Suivre | anneau | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 1 | 2 | 3 | 4 | 0 | 3 | 6 | 9 | 12 | 0 | 1 | 6 | 7 | 12 | 13 |
1 | 5 | 6 | 7 | 8 | 9 | 1 | 4 | 7 | dix | 13 | 2 | 3 | 8 | 9 | ||
2 | dix | 11 | 12 | 13 | 2 | 5 | 8 | 11 | 4 | 5 | dix | 11 |
7. Communication point à point et questions-réponses
sujet
Quel est le lien ou la différence entre la communication point à point et la communication collective ?
Répondre
1. Tous les processus du communicateur doivent appeler la même fonction de communication collective.
2. Les paramètres passés par chaque processus à la fonction de communication collective MPI doivent être cohérents.
3. Le paramètre output_data_p n'est utilisé que dans dest_process, cependant, tous les processus doivent encore passer un paramètre réel correspondant, même si la valeur du paramètre est NULL.
4. La communication point à point est associée à des balises et à des communicateurs. La communication collective n'utilise pas de balises, mais correspond uniquement à travers l'ordre des communicateurs et des appels.
8. Problème de cohérence du cache
sujet
Comment assurer la cohérence du cache, quelles sont les méthodes ? Quelles sont les caractéristiques de chaque méthode ?
Répondre
1. Surveiller le protocole de cohérence du cache
- Plusieurs cœurs partagent un même bus.
- Les signaux transmis sur le bus sont vus par tous les cœurs connectés au bus.
- Lorsque le noyau 0 met à jour sa copie de cache de x, il peut propager ces informations sur le bus.
- Lorsque le noyau 1 écoute le bus, il voit que x a été modifié, il peut donc marquer la copie de x dans son cache comme illégale et trouver x dans la mémoire principale.
2. Protocole de cohérence du cache basé sur l'annuaire
- À l'aide d'une structure de données appelée répertoire, le répertoire enregistre l'état de chaque ligne de cache.
- Lorsqu'une variable est mise à jour, le répertoire courant est consulté et le contrôleur de cache du noyau contenant la ligne de cache de la variable dans le cache est invalidé.
- Lorsqu'un nœud doit accéder ou modifier une ligne de cache, le répertoire peut être utilisé pour déterminer s'il doit envoyer une requête ou un signal d'invalidation à d'autres nœuds.
3. Différence ou lien :
- En raison du coût élevé de la diffusion, le protocole de cohérence de cache basé sur l'annuaire est plus facile à étendre que le protocole de cohérence de cache de surveillance, et il ne dépend pas du bus.
- Les protocoles de cohérence de cache basés sur les répertoires sont plus complexes en raison de la structure de répertoire supplémentaire à maintenir.
9. Problème de dépendance circulaire
sujet
Répondre
# pragma omp parallel for num_threads(thread_count) \
default(none) private(i) shared(a, n)
for (i = 0; i < n; i++)
a[i] = i * (i + 1) / 2;
10. Problème de définition de macro OpenMP
question
Répondre
#include <iostream>
#ifdef _OPENMP
#include <omp.h>
#endif
using namespace std;
int main() {
#ifdef _OPENMP
cout << _OPENMP << endl;
#else
cout << "未定义" << endl;;
#endif
return 0;
}
Sortie : 201511, indiquant que le compilateur prend en charge la spécification OPENMP publiée en novembre 2015.
11. CUDA calcule des vecteurs unidimensionnels et des problèmes de calcul
sujet
numéro de série
![cuda code de série unidimensionnel](https://raw.githubusercontent.com/ma2607219640/picb/main/img/image-20230528215315446.png)
Répondre
fonction noyau
![cuda noyau parallèle unidimensionnel](https://raw.githubusercontent.com/ma2607219640/picb/main/img/image-20230528215420833.png)
12. CUDA vecteur bidimensionnel et problèmes de calcul
Dans ce test de correction d'erreur de code, vous devez comprendre la signification de chaque variable dans le code source,Calculera le décalage。
en série
Code parallèle CUDA
décalage = ligne ∗ N + colonne décalage = ligne * N + colonneoff set t _=rangée _∗N+co l u mn
int col = blockIdx.x * blockDim.x + threadIdx.x;
int row = blockIdx.y * blockDim.y + threadIdx.y;
int index = row * N + col;
13. Multiplication matricielle bidimensionnelle CUDA
Pour que cette question teste la correction d'erreurs du code, vous devez comprendre la signification de chaque variable dans le code, en particulierLa signification de k et la position de k。
numéro de série
Code parallèle CUDA
14、Réduction CUDA
sujet
Quel est le problème potentiel avec le code suivant ? Comment résoudre?
![Sujet de réduction CUDA](https://raw.githubusercontent.com/ma2607219640/picb/main/img/image-20230529113913580.png)
Répondre
analyser
1. L'opération restante (%) est lente : étant donné que CUDA n'a pas d'opération restante prise en charge par le matériel, il compilera l'opération restante en environ 20 instructions, ce qui entraînera des performances GPU très faibles.
2. Ce code est très divergent, car le GPU CUDA adopte l'architecture SIMT, il est donc impossible de laisser les threads du même warp exécuter des instructions différentes ; et le GPU ne peut pas effectuer de prédiction de branche, donc dans ce warp, l'instruction de jugement if calcul Que tid soit pair ou non, la moitié des threads (c'est-à-dire les threads impairs) seront inactifs, ce qui entraînera de graves branchements et une grave dégradation des performances.
résoudre
1. Utilisez la multiplication pour calculer l'index et supprimer l'opération de reste.
2. La branche if est écrite index < blockDim.x
et le jugement conditionnel continu fait que les threads dans le même warp exécutent ou non l'instruction de manière uniforme, améliorant considérablement les performances.
![Solution divergente CUDA](https://raw.githubusercontent.com/ma2607219640/picb/main/img/image-20230529121532474.png)
![image-20230529151836910](https://raw.githubusercontent.com/ma2607219640/picb/main/img/image-20230529151836910.png)