2016-06-26 2 views
1
while (size!=0) 
{ 
    if(local_id<size) 
    local_sums[local_id] += local_sums[local_id+size]; 
    work_group_barrier(clk_local_mem_fence) 
    size = size/2; 
} 

В цикле в то время как CL_LOCAL_MeM_FENCE был включен в задачу IF loop..The было идентифицировать ошибку и комментарии, почему программа не работает работайте, когда CL_LOCAL_MeM_FENCE включен в петлю IFпочему программа не работает, когда CL_LOCAL_MeM_FENCE входит в цикл IF

Я изучаю программирование на GPU, связанное с моим курсом. Я подробно рассказал о своем запросе. Я не понял, почему программа не работает, когда CL_LOCAL_MeM_FENCE включен в петле IF. Пожалуйста, кто-то мне поможет. Спасибо заранее.

+0

есть только суммирование в "if". –

ответ

2

В OpenCL все рабочие элементы в рабочей группе должны выполнять одинаковое количество барьеров для каждого типа. Когда рабочий элемент встречает свой первый забор, он ждет, пока все остальные не достигнут своего первого забора; когда он достигает второго, он ждет, пока все остальные не достигнут забора 2 и т. д.

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

Технически не имеет значения, где в коде присутствует конкретный забор (т. Е. У вас может быть барьер как в if, так и в остальной части условия), но он помогает следовать этим правилам для удобочитаемости.

Смежные вопросы