Depuis que je suis nouveau à cuda .. J'ai besoin de votre aide aimable J'ai ce vecteur long, pour chaque groupe de 24 éléments, je dois faire ce qui suit: pour les 12 premiers éléments, les éléments pairs sont multipliés par -1, pour les 12 éléments suivants, les éléments impairs sont multipliés par -1, puis l'échange suivant a lieu:Optimisation des échanges d'éléments vectoriels en utilisant CUDA
Graphique: parce que je n'ai pas encore assez de points, ne pouvait pas afficher l'image si elle est ici:
http://www.freeimagehosting.net/image.php?e4b88fb666.png
J'ai écrit ce morceau de code, et je me demande si vous pourriez me aider à optimiser davantage pour résoudre les conflits de divergence bancaires ..
// est un multiple sous-vecteur de 24, sont Nds SDM et la mémoire partagée
____shared____ double Mds [sous-vecteur];
____shared____ double Nds [sous-vecteur];
int tx = threadIdx.x;
int tx_mod = tx^0x0001;
int basex = __umul24(blockDim.x, blockIdx.x);
Mds[tx] = M.elements[basex + tx];
__syncthreads();
// flip the signs
if (tx < (tx/24)*24 + 12)
{
//if < 12 and even
if ((tx & 0x0001)==0)
Mds[tx] = -Mds[tx];
}
else
if (tx < (tx/24)*24 + 24)
{
//if >12 and < 24 and odd
if ((tx & 0x0001)==1)
Mds[tx] = -Mds[tx];
}
__syncthreads();
if (tx < (tx/24)*24 + 6)
{
//for the first 6 elements .. swap with last six in the 24elements group (see graph)
Nds[tx] = Mds[tx_mod + 18];
Mds [tx_mod + 18] = Mds [tx];
Mds[tx] = Nds[tx];
}
else
if (tx < (tx/24)*24 + 12)
{
// for the second 6 elements .. swp with next adjacent group (see graph)
Nds[tx] = Mds[tx_mod + 6];
Mds [tx_mod + 6] = Mds [tx];
Mds[tx] = Nds[tx];
}
__syncthreads();
Merci à l'avance ..