Javier Luis Lopez Ответов: 1

Можно ли сделать новую команду opencl для генерации сокращений?


Чтобы получить данные резюме из результатов, таких как следующий код:
int k = get_global_id(0);
double result=d[k]*d[k];

Это должны быть используемые сокращения, которые очень трудно выполнить и уменьшают четкость кода, как сказано в следующей ссылке:
http://developer.amd.com/resources/articles-whitepapers/opencl-optimization-case-study-simple-reductions/"]http://developer.amd.com/resources/articles-whitepapers/opencl-optimization-case-study-simple-reductions

Таким образом, было бы преимуществом, что opencl имел команду сделать это (также над kuda)

Что я уже пробовал:

Это меньший рабочий код, который я сделал, чтобы сделать сокращения:
if (k==0)
{
    int size=HEIGHT;
    while(size>1)
    {
        barrier(CLK_GLOBAL_MEM_FENCE ); //to give time to all rms[k] of the level be filled
        rms[size]=0.0f;size=(1+size)/2;
        rms[k]+=rms[k+size];
    }
}
barrier(CLK_GLOBAL_MEM_FENCE ); //to give time to all rms[k] be filled
media=rms[0]/(float) WIDTH/(float) HEIGHT;

1 Ответов

Рейтинг:
2

tugrulGtx

OpenCL 2.0 уже имеет сокращения для групп потоков.

work_group_reduce_add()

эта команда добавляет все элементы потоков-участников в одно значение и передает его всем потокам-участникам.

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

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