mayoría de las veces se requiere una rama en un programa CUDA o OpenCL, como:CUDA/openCL; ramas de reescritura como no ramificación expresión
for (int i=0; i<width; i++)
{
if(i % threadIdx.x == 0)
quantity += i*i;
}
el código puede siempre (o al menos, la mayor parte del tiempo) reescribirse en estilo no-ramificación:
for (int i=0; i<width; i++)
{
quantity += i*i* (i % threadIdx.x != 0);
}
la disyuntiva parece ser ya sea corriendo en una sola ranura urdimbre frente hacer más cálculos en todos los hilos (en el segundo caso, la suma se ejecuta siempre, sólo que a veces el valor es cero)
Suponiendo que las operaciones de bifurcación tomarán múltiples ranuras de urdimbre para cada posible bifurcación, uno esperaría que el segundo sea consistentemente mejor que el primero, ahora mi pregunta es; ¿Puedo confiar en que el compilador optimice 1) en 2) cuando tenga sentido, o no exista un criterio de aplicación amplia, lo que implica que no se puede decidir en general cuál es mejor sin intentar y perfilar?
¿Qué orden es el ancho? Si sabe que el ancho es bastante grande, no debe iterar a través de un ciclo for para hacerlo, ya que sabe qué valores va a utilizar. 'Mientras (i
3Pi