CUDA/openCL; переписывание ветвей как выражение без ветвления

В большинстве случаев требуется ветвь в программе CUDA или OpenCL, например:

for (int i=0; i<width; i++)
{
   if( i % threadIdx.x == 0)
     quantity += i*i;
}

код может всегда (или, по крайней мере, в большинстве случаев ) можно переписать в неветвящемся стиле:

for (int i=0; i<width; i++)
{
   quantity += i*i* (i % threadIdx.x != 0);
}

компромисс, по-видимому, состоит в том, чтобы либо работать в одном варп-слоте, либо выполнять больше вычислений во всех потоках (во втором случае сумма выполняется всегда, просто иногда значение равно нуля)

Предполагая, что операции ветвления будут занимать несколько слотов деформации для каждой возможной ветви, можно было бы ожидать, что вторая будет последовательно лучше, чем первая, Теперь мой вопрос: Могу ли я полагаться на компилятор для оптимизации 1) в 2) всякий раз, когда имеет смысл, или нет общеприменимого критерия, из которого следует, что без проб и профилирования нельзя решить вообще, какой из них лучше?

6
задан lurscher 15 May 2012 в 21:53
поделиться