gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:16:12 24 4
gpt4 key购买 nike

我试图编写一个简单的 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)

关于c++ - 为什么在 CUDA 的 __global__ 内核中使用 max 和 min 宏没有给出正确答案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30245943/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com