Оптимизация ветвления для цикла в openCL - PullRequest
0 голосов
/ 05 мая 2018

У меня есть код ядра что-то вроде этого

__kernel fn(***){
    //X,Y would be image cordinates
    int x = get_global_id(0);
    int y = get_global_id(1);

    //Initialize pixel value
    int c =  -5 + x * dx;
    int d =  -5 + y * dy;

    int k=0;
    for(; k< 500; k++){
        //Perform Some Calculations using c and d
        //Most of the calculations happen here
        if(val > threshold)
            break;
    }
    //Write data based on k
    out[x*width+j] = k;
}

У меня такое ощущение, что, поскольку большинство вычислений происходит внутри цикла for, а цикл for создает ветку, некоторые рабочие элементы в рабочей группе завершают выполнение своего ядра и ждут, пока вся рабочая группа завершит работу. полный.

Как это можно оптимизировать, если вывод основан на счетчике выполнения k?

1 Ответ

0 голосов
/ 05 мая 2018

Цикл for будет иметь ветку, даже если вы удалите это

if(val > threshold)
    break;

Он будет сгенерирован компилятором, чтобы увидеть, следует ли продолжать цикл или нет. Хотя мы можем удалить дополнительную ветку, созданную внутри цикла for.

k += static_cast<int>(val > threshold) * 500;

Это увеличит k на 500, если val > threshold, и, следовательно, выйдет из цикла в той же ветви, которая проверяет, достигло ли k нужного значения, без дополнительной ветви. В зависимости от того, насколько тяжелы вычисления внутри цикла, это может не иметь значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...