Нейтральный элемент для min () и max () в сокращении OpenCL
я делаю сокращение (нахождение минимума и максимума)float[]
массив на GPU через OpenCL.I '
м загружает некоторые элементы изglobal
память вlocal
память для каждой рабочей группы. Когда глобальный размер неt, кратный размеру рабочей группы, я дополняю глобальный размер, так что он становится кратным глобальному размеру. Рабочие элементы после конца массива помещают нейтральный элемент сокращения вlocal
объем памяти.
Но что этот нейтральный элемент должен быть дляmax()
- максимальная функция?Документация OpenCL дает,MAXFLOAT
HUGE_VALF
а такжеINFINITY
как очень большой положительный (или без знака)float
ценности. Имеет ли смысл иметь нейтральный элемент, чтобы быть-INFINITY
например?
Прямо сейчас ям используюHUGE_VALF
в качестве нейтрального элемента дляmin()
, но документы также говорят, чтоHUGE_VALF
используется в качестве значения ошибки, так что, возможно, это 'плохая идея
Сокращение ядра (Код):
#define NEUTRAL_ELEMENT HUGE_VALF
#define REDUCTION_OP min
__kernel void reduce(__global float* weights,
__local float* weights_cached
)
{
unsigned int id = get_global_id(0);
// Load data
if (id < {{ point_count }}) {
weights_cached[get_local_id(0)] = weights[id];
} else {
weights_cached[get_local_id(0)] = NEUTRAL_ELEMENT;
}
barrier(CLK_LOCAL_MEM_FENCE);
// Reduce
for(unsigned int stride = get_local_size(0) / 2; stride >= 1; stride /= 2) {
if (get_local_id(0) < stride) {
weights_cached[get_local_id(0)] = REDUCTION_OP(weights_cached[get_local_id(0)], weights_cached[get_local_id(0) + stride]);
barrier(CLK_LOCAL_MEM_FENCE);
}
// Save
weights[get_group_id(0)] = weights_cached[0];
}
Редактировать: Я на самом деле в конечном итоге с помощьюfmin()
а такжеfmax()
вместе сNAN
в качестве нейтрального элемента - это в основном гарантированно работает в соответствии сOpenCL документация так как числовое значение всегда будет возвращено (NAN
возвращается только если дваNAN
значения приведены).