2

我正在float[]通过 OpenCL 在 GPU 上减少(找到最小值和最大值)数组。

我正在将内存中的一些元素加载globallocal每个工作组的内存中。当全局大小不是工作组大小的倍数时,我填充全局大小,使其成为全局大小的倍数。数组末尾之后的工作项将归约的中性元素放入local内存。

但是那个中性元素应该是为了什么max()——最大功能? OpenCL 文档给出MAXFLOAT,HUGE_VALFINFINITY非常大的正(或无符号)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,这基本上可以保证工作,因为将始终返回数值(仅在给出两个值时才返回)。NANNAN

4

1 回答 1

2

引用 OpenCL 标准:

HUGE_VALF 的计算结果为 +infinity。

HUGE_VALF因此,使用and之间没有真正的区别(隐含意图除外)INFINITY;两者都可以正常工作以min减少。就清晰度而言,我略微偏爱INFINITY,因为HUGE_VALF它在概念上用于边缘情况返回,但事实并非如此。

同样,-INFINITY用于max减少。

MAX_FLOAT如果您的数组包含无穷大,则不会作为中性元素正确运行。

于 2013-01-23T13:28:20.730 回答