2016-02-29 1 views
1

Dans le fichier de code source LLVM llvm/lib/Target/NVPTX/NVPTXIntrinsics.td, les définitions des types de mémoire CUDA peuvent être: atom_add, atom_sub, atom_max, atom_min, atom_inc, atom_dec, etc. vu. Mais je ne pouvais pas trouver les opérations de chargement et de stockage sur les mémoires CUDA n'importe où dans ces fichiers. Alors, où les opérations de chargement et de stockage sont définies pour les types de mémoire CUDA dans llvm?Définitions des opérations de chargement et de stockage sur les types de mémoire CUDA (par exemple partagé, global) dans llvm

Répondre

2

Vous ne les trouverez pas comme intrinsèques car il n'y a pas d'intrinsèques pour charger et stocker dans la hiérarchie de mémoire CUDA. NVPTX utilise les espaces adresse sur l'opérande pointeur d'une instruction de chargement ou de stockage pour déterminer quelle instruction PTX doit être générée.

une charge à un pointeur vers address space 1 se traduira par ld.global.<type> alors qu'une charge effectuée sur un pointeur vers address space 3 (mémoire partagée) se traduira par une instruction ld.shared.<type>. Charge un pointeur générique, c'est-à-dire, un pointeur dans address space 0 donnera une instruction ld.<type>.

Cette traduction a lieu lors de la sélection d'instructions dans le backend NVPTX. Jetez un oeil à ./llvm/lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp pour savoir comment se passe la sélection d'instructions dans NVPTX. Par exemple dans SDNode *NVPTXDAGToDAGISel::SelectLoad(SDNode *N) les instructions de chargement sont traitées.