J'ai créé un noyau simple pour tester l'accès mémoire coalescé en observant le nombre de transactions, dans la carte nvidia gtx980. Le noyau est,Nombre total de transactions de chargement en accès mémoire coalescé
__global__
void copy_coalesced(float * d_in, float * d_out)
{
int tid = threadIdx.x + blockIdx.x*blockDim.x;
d_out[tid] = d_in[tid];
}
Quand je lance cela avec les configurations du noyau suivantes
#define BLOCKSIZE 32
int data_size = 10240; //always a multiply of the BLOCKSIZE
int gridSize = data_size/BLOCKSIZE;
copy_coalesced<<<gridSize, BLOCKSIZE>>>(d_in, d_out);
Depuis l'accès aux données dans le noyau est entièrement coalasced, et puisque le type de données est flottante (4 octets) , Le nombre de charge/Transactions de magasin attendus peuvent être trouvés comme suit,
charge transaction Taille = 32 octets
nombre de flotteurs qui peut être chargé par trans Action = 32 octets/4 octets = 8
Nombre de transactions nécessaires pour charger des données 10240 = 10240/8 = 1280 transactions
Le même montant des transactions sont attendues pour l'écriture des données aussi bien.
Mais en observant les mesures nvprof, les résultats suivants ont été
gld_transactions 2560
gst_transactions 1280
gld_transactions_per_request 8.0
gst_transactions_per_request 4.0
Je ne peux pas comprendre pourquoi il faut deux fois les opérations dont il a besoin pour le chargement des données. Mais quand il s'agit de l'efficacité de chargement/stockage à la fois les métriques donne 100%
Qu'est-ce qui me manque ici?
Comment avez-vous alloué d_in et d_out? – kangshiyin
'cudaMalloc (& d_in, sizeof (float) * taille_données);' et 'cudaMalloc (& d_out, sizeof (float) * taille_données);' – BAdhi