2015-02-17 2 views
1

Вы часто можете увидеть OpenCL ядра, такие какДолжен ли я вернуться, если глобальный идентификатор превышает число элементов в OpenCL?

kernel void aKernel(global float* input, global float* output, const uint N) 
{ 
     const uint global_id = get_global_id(0); 
     if (global_id >= N) return; 
    // ... 
} 

Я интересно, если это if (global_id >= N) return; действительно необходимо, особенно если вы создаете буфер глобального размера.

  • В каких случаях они являются обязательными?
  • Это конвенция OpenCL?

ответ

3

Очень распространено иметь это условное выражение в ядрах OpenCL 1.x из-за требования, чтобы ваш глобальный рабочий размер был целым числом, кратным размеру вашей рабочей группы. Поэтому, если вы хотите указать размер рабочей группы 64, но иметь 1000 элементов для обработки, вы делаете глобальный размер 1024, пропустите 1000 в качестве параметра (N) и выполните проверку.

В OpenCL 2.0 было отменено целочисленное множественное ограничение, поэтому ядра OpenCL 2.0 с меньшей вероятностью нуждаются в этом условном выражении.

4

Это не конвенция - это то же самое, что и в обычном C/C++, если вы хотите пропустить остальную часть функции. У него есть потенциал ускорить выполнение, не делая ненужной работы.

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

Вы должны быть осторожны, возвращаясь так, потому что, если в ядре после возврата есть барьер, вы можете затормозить выполнение. Это связано с тем, что все рабочие элементы в рабочей группе должны быть преодолены. Поэтому, если есть барьер, либо условие должно быть истинным для всей рабочей группы, либо должно быть ложным для всей рабочей группы.

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