为什么在 __global__ CUDA 内核中使用 max 和 min 宏没有给出正确答案?

Why use max and min macro in __global__ kernel of CUDA not giving correct answer?

我正在尝试编写一个简单的 CUDA 函数来模糊图像。我使用自己定义的最大和最小宏作为

#define min(a, b) ((float)a > (float)b)? (float)b: (float)a
#define max(a, b) ((float)a > (float)b)? (float)a: (float)b 

__global__内核的部分是:

   float norm;
   float sum = 0;// when filter exceed border, norm will affect!
   int center = radius * filterWidth + radius;
   int imgx = 0, imgy = 0;
   for (int y = -radius; y <= radius; y++)
   {
       for (int x = -radius; x <= radius; x++)
       {
           imgx = min(max(x + absolute_image_position_x, 0), numCols-1);
           //imgx = min(numCols - 1, imgx);
           imgy = min(max(y + absolute_image_position_y, 0), numRows -1);
           //imgy = min(numRows-1, imgy);
           sum += (float) inputChannel[(imgy*numCols) + imgx] * filter[center + (y*filterWidth) + x];
       }
   }

   outputChannel[pos] = (unsigned char) sum;

但是当我尝试调试时,最小值和最大值不能给出正确的答案。例如,min(max(10,0),100) 将给出 100.0f! 我没有检查每一步为什么错了。但是后来我改用cuda数学函数,结果就对了。 任何人都有想法。 CUDA内核对宏的使用有限制吗?

去掉 (float) 以清除混乱,您的宏如下所示:

#define min(a, b) (a > b)? b: a
#define max(a, b) (a > b)? a: b 

和示例使用(简化了几个变量名):

imgx = min(max(x + aipx, 0), nc-1);

将扩展为:

imgx = ((x + aipx > 0)? x + aipx: 0 > nc-1)? nc-1: (x + aipx > 0)? x + aipx: 0;

也许解析不正确?尝试在宏参数的使用周围加上额外的括号:

#define min(a, b) ((a) > (b))? (b): (a)
#define max(a, b) ((a) > (b))? (a): (b)