__shfl_down y __shfl_down_sync dan resultados diferentes

Estoy confundido por __shfl_down y __shfl_down_sync, dan diferentes resultados.

__global__ void shufledown1(double* a, double *b,double *c, int N)
{
    double  temp = 2.0;
    __syncthreads();

   for (int offset = 32/2; offset > 0; offset /= 2){
         temp+=__shfl_down(temp, offset,32);
   }
    printf("%d %f %d \n",threadIdx.x ,temp,blockDim.x * gridDim.x);
}
__global__ void shufledown2(double* a, double *b,double *c, int N)
{
    double  temp = 2.0;
    __syncthreads();

   for (int offset = 32/2; offset > 0; offset /= 2){
       temp+=__shfl_down_sync(temp, offset,32)
   }
    printf("%d %f %d \n",threadIdx.x ,temp,blockDim.x * gridDim.x);
}

El primero dio:

0 64.000000 64 
'''''
''''
''''
63 64.000000 64 

El segundo dio:

0 33.000000 64
'''''
''''
''''
63 33.000000 64 

El núcleo se ejecutó con 1 bloque de 64 hilos. Saludo

Respuestas a la pregunta(1)

Su respuesta a la pregunta