2014-06-19 3 views
0

Я новичок в OpenCL. Как я могу задержать сценарий OpenCL Kernel без создания циклов? У меня есть код, который в некоторых случаях необходимо подождать некоторое время, а затем возобновить выполнение как такOpenCL Ядро ожидания/задержки

__kernel void test(uint4 value,uint4 delay) 
{ 
    uint id = get_global_id(0); 

     //some code 
     for(uint i=0;i<delay;i++) { //... do nothing like this? } 
} 

Но я полагаю, что цикл будет делать графический процессор занят, как ад, там что-то я могу использовать как сон, возможно, в ядро CL? Я посмотрел в документации sdk, но пока ничего не нашел. Помоги пожалуйста.

+0

Нужно ли ожидать определенного количества времени или использовать прерывание типа 'clWaitForEvents'? – cegfault

+0

Да, мне нужно подождать определенное количество времени, я уже посмотрел на 'clWaitForEvents' – Vanya

+0

Я не слишком хорошо знаком с opencl, но не' sleep' работает? – cegfault

ответ

3

Спецификация OpenCL предназначена для хруста печати данных. Не для ожидания/сна. Даже если вы этого добьетесь, вы нарушите много хороших правил дизайна OpenCL.

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

Пожалуйста, передумайте, что вам нужно, и если оно подходит для параллельных вычислений.

+0

Итак, тогда я должен использовать 'clWaitForEvents'? то, что я хочу достичь, - это в основном дросселирование. – Vanya

+0

Все управление исполнением устройства должно выполняться со стороны хоста. Устройство должно заботиться только о завершении заданий в очереди, как можно быстрее. Это все. Если вы намерены замедлить выполнение, сделайте это на стороне хозяина. – DarkZeros

0

Не типично. Если вы слишком долго задерживаетесь в ядре GPU, драйвер TDR и аварийно завершает работу. В общем, ядра не предназначены для сна. См. this question и this question.

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

+1

Могу я просто разместить ассемблер «nop» внутри? – Vanya

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