2013-12-24 7 views
0

Так что я пытаюсь сделать что-то вроде этого:OpenCL: синхронизация между ядрами

В моем коде хост У меня есть цикл

for(int i = 0; i < params.maxIters; i++){ 
    launch1DKernel(kernel…) 
} 

и в моем ядре я thave

__kernel k(__global int * i, …){ 
    somearray[i * size + offset] = some_val; 
    if(get_global_id(0) == 0){ 
     (*i) = (*i) + 1; 
    } 
} 

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

ответ

1

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

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

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

0

Вам необходимо использовать функции atomic_ *, чтобы гарантировать, что глобальная память будет тем, что вы ожидаете от нее.

Будьте осторожны, хотя это очень медленно.

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