2015-11-03 2 views
0

Я новичок в OpenCL, но много лет работал с opengl \ webgl для рисования и GPGPU.Стоп истинные результаты в буфере вывода

Я хочу проверить пересечение полилинии с другими. Полилиния - это набор связанных сегментов - как LINE_STRIP.

У меня есть полилинии. каждая полилиния имеет много точек. Я помещаю все в один буфер. когда буфер выглядит как [pntsCount, x, y, x, y ...., pntsCount, x, y, ....]. назовем это - буфер точек.

Кроме того, у меня есть буфер, который содержит индексы начала каждой полилинии, например индексы значений «pntsCount». позволяет назвать это - начинает буфер

Мое глобальное количество полилиний = длина начального буфера.

В каждом рабочем элементе я выполняю свою текущую полилинию (из буфера полилиний) и проверяю пересечение с одной полилинией.

Сегодня я предоставляю свой выходной буфер ядра размера буфера для запуска, если есть пересечение или нет.

Таким образом, после окончания ядра. Я запускаю буфер в хосте и проверяю, что имеет значение true \ false.

Мой вопрос: Могу ли я просто складывать свои истинные результаты в выходной буфер вместо истинных/ложных значений для всех полилиний. То, что я имею в виду, Сохранение в моем представлении только индексов полилиний, которые пересекают мою одиночную полилинию.

поэтому мой буфер результатов будет для exmaple [4,24,10, ...] и не [0,0,0,1,0,0,0,0,0,1 .... ]

Для этого мне нужно, чтобы переменная, содержащая текущий индекс в буфере результатов, установила значение и затем увеличила его для следующего результата. И перед первым ядром вызова мне нужно установить его в 0.

Я видел, что есть atomic_inc, кроме того, я могу добиться того, что с локальной памятью и барьерами ..

Может кто-то сделать заказ в это для меня? и, может быть, пример, как это сделать?

ответ

0

Что является узким местом? Вывод данных или расчет? Если это расчёт, то перейдите к атомному подходу.

Вы можете сделать это следующим образом:

  • Использование atomic_inc() на глобальной переменной, получить возвращаемое значение. И напишите на этот адрес строку-строку или сами данные линии.
  • Для дополнительной оптимизации собирайте локально все строки, которые являются истинными, а затем введите atomic_add() по всему миру и после этого напишите в возвращаемые значения все данные line_id или данные.

ПРИМЕЧАНИЕ. Атомные функции возвращают значение, которое было до операции. Итак, если вы atom_add (10), вы получите 0, а следующий atomic_add() получит 10. Таким образом, очень полезно использовать это значение в качестве базового адреса для записи в область памяти.

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

Пример:


Ведущий:

//Create a buffer to hold a counter 
cl::Buffer counter(&context, CL_READ_WRITE, sizeof(cl_uint)); 

while(running){ 
    //Reset it 
    cl_uint zero_counter = 0; 
    queue.enqueueWriteBuffer(counter, CL_FALSE, 0, sizeof(cl_uint), &zero_counter); 
    //Launch the kernel 
    ... 
    //Read it back 
    cl_uint data_counter = 0; 
    queue.enqueueReadBuffer(counter, CL_TRUE, 0, sizeof(cl_uint), &data_counter); 
    //Read back other buffers using data_counter's returned value 
    ... 
} 

Прибор:

__kernel mykern(__global uint * counter, ...){ 
    ... 
    if(condition){ //Condition to add it to the output buffer 
     uint addr = atomic_inc(counter); 
     out[addr] = ... //Write it there 
    } 
} 
+0

bottelneck является узел, который нужно читать и работать над этой длинной буфер результатов, для того, чтобы найти то, что было пересечено. может быть, что ничего не пересекалось, и я все равно буду пробежать по всему буфере, чтобы понять это. Возможно ли также получить эту глобальную переменную? так что я буду знать, сколько пересечений было там? –

+0

Добавлен поясняющий пример – DarkZeros

+0

Это было сделано в конце :) Хотя параметр Counter в ядре должен быть указателем (добавить '*') и удалить '&' в 'atomic_inc', иначе он не прошел build –

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