Я граю з прикладом на opencl:
__kernel void atomic(__global int* x) {
__local int a, b;
a = 0; b = 0;
a++;
atomic_inc(&b);
x[0] = a;
x[1] = b;
x[2]++;
atomic_inc(x+3);
}
Запуск цього коду з global_size = 1024
і workgroup_size = 8
це наступний вивід:
[1 8 1 1024]
Я можу зрозуміти, що відбувається для всіх випадків, крім вартості, яку дають x[1]
. Чому варто x[1]
не 1024 але 8?
Відповіді:
3 для відповіді № 1Під x[1]
зберігається значення b
яка є змінною, що знаходиться в __local
адресний простір, тобто змінна спільного для всіх робочих елементів у робочій групі. Кожна робоча група має b
ініціалізовано до 0, а атомарне збільшення до 8, оскільки розмір робочої групи дорівнює 8 (кожен елемент роботи збільшується на 1).