====== Pattern Réduction ====== Nombre opération : N-1 Nombre d'étapes : log(N) Utilisation de dynamique parallélisme ? Permet de lancer moins de threads ? Evite les threads qui ne font rien ? Problème de synchronisation ? __shared__ float partialSum[2*BLOCK_SIZE]; unsigned int t = threadIdx.x; unsigned int start = 2*blockIdx.x*blockDim.x; partialSum[t] = input[start + t]; partialSum[blockDim+t] = input[start + blockDim.x+t]; for (unsigned int stride = 1; stride <= blockDim.x; stride *= 2) { __syncthreads(); if (t % stride == 0) partialSum[2*t] += partialSum[2*t+stride]; } Avec stride : for (unsigned int stride = blockDim.x; stride > 0; stride /= 2) { __syncthreads(); if (t < stride) partialSum[t] += partialSum[t+stride]; } Divergence : sur les 5 derniers steps. Dans le cas précédent, seuls les 5 premiers n'avaient pas de divergence