J'ai le code suivant qui parcourt progressivement une chaîne de bits et les réorganise en blocs de 20 octets. J'utilise 32 * 8 blocs avec 40 fils par bloc. Cependant, le processus prend quelque chose comme 36ms sur mon GT630M. Y a-t-il une optimisation supplémentaire que je peux faire? Surtout en ce qui concerne la suppression de l'if-else dans la boucle la plus interne.Optimisation d'un noyau de manipulation Bit-Wise
__global__ void test(unsigned char *data)
{
__shared__ unsigned char dataBlock[20];
__shared__ int count;
count = 0;
unsigned char temp = 0x00;
for(count=0; count<(streamSize/8); count++)
{
for(int i=0; i<8; i++)
{
if(blockIdx.y >= i)
temp |= (*(data + threadIdx.x*(blockIdx.x + gridDim.x*(i+count)))&(0x01<<blockIdx.y))>>(blockIdx.y - i);
else
temp |= (*(data + threadIdx.x*(blockIdx.x + gridDim.x*(i+count)))&(0x01<<blockIdx.y))<<(i - blockIdx.y);
}
dataBlock[threadIdx.x] = temp;
//do something
}
}
Vous pouvez commencer par * toujours * en utilisant des tailles de blocs qui sont des multiples arrondis de la taille de la chaîne. L'utilisation de 40 threads par bloc gaspille environ 37% de tous les cycles disponibles sur votre GPU. – talonmies
Vous pouvez également lancer plusieurs threads en même temps pour masquer les temps de latence. –
Votre boucle externe écrit 'dataBlock [threadIdx.x] = temp;' chaque itération - de sorte que vous écrasez le même emplacement 'streamSize/8' fois. Déplacez cette ligne en dehors de la boucle. – harrism