maggior parte del tempo un ramo è richiesto in un programma CUDA o OpenCL, come:CUDA/openCL; rami riscrittura come senza ramificazioni espressione
for (int i=0; i<width; i++)
{
if(i % threadIdx.x == 0)
quantity += i*i;
}
il codice può sempre (o almeno la maggior parte del tempo) essere riscritta in stile non ramificati:
for (int i=0; i<width; i++)
{
quantity += i*i* (i % threadIdx.x != 0);
}
il compromesso sembra essere sia in esecuzione in un singolo slot ordito contro facendo più calcoli su tutti i fili (nel secondo caso, la somma viene eseguita sempre, solo che a volte il valore è zero)
Supponendo che le operazioni di ramificazione occuperanno più intervalli di curvatura per ogni ramo possibile, ci si aspetterebbe che il secondo sia costantemente migliore del primo, Ora la mia domanda è; Posso fare affidamento sul compilatore per ottimizzare 1) in 2) ogni volta che ha senso, o non esiste un criterio ampiamente applicabile, il che implica che non si può decidere in generale quale sia il migliore senza provare e profilare?
Che ordine è larghezza? Se sai che la larghezza è abbastanza grande, non dovresti iterare attraverso un ciclo for per farlo, poiché sai quali valori utilizzerai. 'Mentre (i
3Pi