我正在float[]
通过 OpenCL 在 GPU 上减少(找到最小值和最大值)数组。
我正在将内存中的一些元素加载global
到local
每个工作组的内存中。当全局大小不是工作组大小的倍数时,我填充全局大小,使其成为全局大小的倍数。数组末尾之后的工作项将归约的中性元素放入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()
andfmax()
一起用作中性元素 - 根据OpenCL 文档NAN
,这基本上可以保证工作,因为将始终返回数值(仅在给出两个值时才返回)。NAN
NAN