Я пытаюсь сделать кумулятивный расчет, подобный сокращению, в котором необходимо сохранить 4 разных значения в зависимости от определенных условий. Мое ядро получает длинные массивы в качестве входных данных и должно хранить только 4 значения, которые являются «глобальными суммами», полученными из каждой точки данных на входе. Например, мне нужно сохранить сумму всех значений данных, удовлетворяющих определенному условию, и количество точек данных, удовлетворяющих указанному условию. Ядро ниже, чтобы сделать его более ясным:OpenCL: несколько рабочих элементов сохраняют результаты на один и тот же адрес глобальной памяти
__kernel void photometry(__global float* stamp,
__constant float* dark,
__global float* output)
{
int x = get_global_id(0);
int s = n * n;
if(x < s){
float2 curr_px = (float2)((x/n), (x % n));
float2 center = (float2)(centerX, centerY);
int dist = (int)fast_distance(center, curr_px);
if(dist < aperture){
output[0] += stamp[x]-dark[x];
output[1]++;
}else if (dist > sky_inner && dist < sky_outer){
output[2] += stamp[x]-dark[x];
output[3]++;
}
}
}
Все значения не объявленные в ядре предварительно определены с помощью макросов. s
- длина входных массивов stamp
и dark
, которые составляют n
x n
матрицы, сплющенные до 1D.
Я получаю результаты, но они отличаются от моей версии процессора. Конечно, мне интересно: - это правильный способ сделать то, что я пытаюсь сделать? Могу ли я быть уверенным, что каждый пиксельный файл добавляется только один раз? Я не могу думать о другом способе сохранения совокупных значений результата.
Несколько потоков, пытающихся изменить те же индексированные элементы. Вы нуждаетесь в доступе к атомам. Атомные инструкции добавления и атома. Таким образом, все потоки будут получать обновленные значения вместо неопределенных значений. https://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/atomicFunctions.html –
@huseyintugrulbuyukisik благодарит вас за ваше предложение. Однако это будет необходимо, даже если потоки не будут считываться из выходного буфера? Буферы, из которых прочитанные потоки не изменяются при вычислении – Francisca