La sérialisation de la mémoire globale simultanée est-elle accessible à une adresse lorsqu'il existe des niveaux de cache L1 et L2?

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

  •  21-12-2019
  •  | 
  •  

Question

Sur la base de ce que je sais, lorsque les threads d'une chaîne d'accès à la même adresse dans la mémoire globale, les demandes sont sérialisées, il est donc préférable d'utiliser la mémoire constante.La sérialisation des accès à la mémoire globale simultanée se produit-t-elle lorsque GPU est équipé de niveaux de cache L1 et L2 (dans l'architecture Fermi et Kepler)?En d'autres termes, lorsque les threads d'un évacuation de la chaîne d'accès à la même adresse de mémoire globale, effectuez 31 threads d'un bénéfice de chaîne d'une existence de cache, car 1 thread a déjà demandé cette adresse?Que se passe-t-il lorsque l'accès est une lecture et une fois que l'accès est une écriture?

Était-ce utile?

La solution

Accès global simultané à la même adresse par les threads dans la même chaîne de Fermi et Kepler ne sont pas sérialisés. La lecture de chaîne a un mécanisme de diffusion qui satisfait à toutes ces lectures d'une seule lecture Cacheline sans impact sur la performance. La performance est la même que si elle était une lecture entièrement coalescée. Ceci est vrai, quels que soient les spécificités de cache, par exemple, il est vrai même si la mise en cache L1 est désactivée.

La performance des écrivies simultanées n'est pas spécifiée (AFAIK) mais comportementalement , les écrivies simultanées sont toujours sérialisées et la commande est indéfinie.

Modifier Répondre aux questions supplémentaires ci-dessous:

  1. Même si toutes les filetages de la chaîne écrivent la même valeur dans la même adresse, est-ce que cela est sérialisé? N'y a-t-il pas un mécanisme de diffusion d'écriture qui reconnaît une telle situation?

Il n'y a pas de mécanisme de diffusion en écriture qui examine toutes les écrivies simultanées pour voir s'ils sont tous identiques, puis prennent des mesures en fonction de cela. La bonne réponse est que les écritures se produisent dans l'ordre non spécifié et les caractéristiques de performance ne sont pas définies. Évidemment, si toutes les valeurs étant écrites sont identiques, vous pouvez être assuré que la valeur qui finit par l'emplacement sera cette valeur. Mais si vous demandez si l'activité de l'écriture est effondrée à un seul cycle ou nécessite plusieurs cycles à compléter, que le comportement réel est indéfini (sans papiers) et, en fait mai varier d'une architecture à l'autre ( Par exemple, CC1.x peut sérialiser en tellement que toutes les écritures sont effectuées, alors que cc2.x peut "sérialiser" de telle sorte que l'on écrit "gagne" et que tous les autres soient jetés, ne consomment pas de cycles réels.) Encore une fois, la performance est non documentée / non spécifiée, mais le comportement observable du programme est défini.

2 Avec ce mécanisme de diffusion que vous avez expliqué, la seule différence entre l'accès à la diffusion de mémoire constante et l'accès à la diffusion de la mémoire globale est que le premier peut acheminer l'accès à la mémoire globale, mais ce dernier a un matériel dédié et est plus rapide. , non?

__constant__ Memory utilise le cache constant, qui est un élément de matériel dédié disponible sur une base par SM et met en cache une section particulière de la mémoire globale dans la mode en lecture seule. Ce cache HW est séparé physiquement et logiquement du cache L1 (s'il existe et est activé) et L2 cache. Pour Fermi et Au-delà, les deux mécanismes soutiennent diffusés sur lecture, et pour le cache constant, il s'agit du motif d'accès préféré, car le cache constant ne peut conserver qu'un accès en lecture par cycle (c.-à-d. Ne prend pas en charge une cachette entière lue par une chaîne.) L'un ou l'autre mécanisme peut "toucher" dans le cache (si présent) ou "manquer" et déclencher une lecture globale. Lors de la première lecture d'un emplacement (ou de Cacheline) donné, le cache Niether disposera des données demandées et il «manquera donc donc» et déclenchera une lecture globale de la lecture, pour le service de l'accès. Par la suite, dans les deux cas, des lectures ultérieures seront desservies hors du cache, en supposant que les données pertinentes ne soient pas expulsées dans l'intervalle. Pour les premiers périphériques CC1.x, le cache de mémoire constante était très précieux puisque ces premiers appareils n'avaient pas de cache L1. Pour Fermi et au-delà de la principale raison d'utiliser le cache constant serait si des données identifiables (c.-à-d. Lecture uniquement) et des modèles d'accès (même adresse par chaîne) sont disponibles, à l'aide du cache constant empêchera ces lectures de voyager à travers L1 et éventuellement expulser d'autres données. En effet, vous augmentez quelque peu l'empreinte macabotable, sur ce que la L1 peut supporter seul.

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