Старайтесь поддерживать порядок доступа к памяти, непосредственно перед глобальной записью
// here
barrier(CLK_GLOBAL_MEM_FENCE);
//copy results from private memory to global:
const long p = ( x * height + y ) * BEST;
, если ваша проблема производительности связана с шаблоном доступа к памяти, это должно облегчить ее.
Если проблема возникает только из-за переходя между потоками, вы также можете попытаться сохранить порядок во втором l oop после самого внутреннего l oop:
for ( short si = 0; si < BEST; ++ si ) {
if ( d[si] == -1 || diff < d[si] ) {
d[si] = diff;
s[si][0] = tw;
s[si][1] = th;
break;
}
}
barrier(CLK_LOCAL_MEM_FENCE); // local => should be faster for many devices
, чтобы на каждой итерации все соседние потоки объединялись и продолжали выполнять одни и те же инструкции пока новый разрыв не нарушит порядок.
Наконец, алгоритм выглядит как сортировка различий значений пикселей между ОБЪЕМНЫМИ пикселями путем уменьшения значений. Таким образом, самый внутренний l oop может быть фактически перемещен к самому внешнему, и все ветвления должны быть минимизированы, сразу после двух самых внутренних новых петель (которые были самыми внешними раньше). Но это увеличивает image[ th * width + tw ]
чтение в BEST раз, поэтому оно может быть медленнее (возможно, не тогда, когда данные перемещаются в локальную память до этого). Но теперь d не обязательно должен быть массивом, поэтому ЛУЧШЕЕ число частных регистров сохраняется и может повысить производительность за счет уменьшения давления в регистре.