2012-06-13 3 views
4

я заметил ряд источников ядра, которые выглядят следующим образом (найденный случайным погуглить):Проверка get_global_id в ядре OpenCL Необходима?

__kernel void fill(__global float* array, unsigned int arrayLength, float val) 
{ 
    if(get_global_id(0) < arrayLength) 
    { 
     array[get_global_id(0)] = val; 
    } 
} 

Мой вопрос, если что, если-заявление действительно необходимо (при условии, что «arrayLength» в этом примере является так же как и глобальный рабочий размер).

В некоторых более «профессиональных» ядрах я видел, это не настоящее время. Мне также кажется, что аппаратное обеспечение преуспеет, чтобы не назначать ядра для бессмысленных координат.

Однако я также знаю, что процессоры работают в группах. Следовательно, я могу себе представить, что некоторые процессоры группы ничего не должны делать (например, если у вас есть 1 группа размером 16 и рабочий размер 41, тогда группа будет обрабатывать первые 16 рабочих элементов, затем затем 16, затем следующие 9, причем 7 процессоров ничего не делают - получают ли они фиктивные ядра?).

Я проверил spec. и релевантно только упоминание о «get_global_id» такой же, как в интернет-документации, которая гласит:

The global work-item ID specifies the work-item ID based on the number of global work-items specified to execute the kernel. 

. , , основанный как?

И что это? Можно ли опустить, если размер массива кратен размеру рабочей группы? Какие?

Спасибо,
Ian

ответ

3

У вас есть правильный ответ уже, я думаю. Если глобальный размер выполнения вашего ядра совпадает с размером массива, то этот оператор if бесполезен.

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

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