使用Ceil和整数

时间:2014-09-29 17:54:31

标签: c optimization ceil

所以我刚从学校项目中得到了我的成绩,但我的成绩很好,但是平分师因为我没有打电话给ceil(...)而得了5分。它是一个使用CUDA的并行计算课程,但问题与任何CUDA功能都没有直接关系。

以下是“违规”行:

dim3 dimGrid(n / dimBlock.x, n / dimBlock.y);

他的主张是我应该做的:

dim3 dimGrid(ceil(n / dimBlock.x), ceil(n / dimBlock.y));

所以我的问题是,如果n和dimBlock。*是整数,为什么我会被标记为off?他们的结果将在ceil被调用和截断之前计算出来。因此,为此做出标记似乎很愚蠢。

以下示例似乎表明GCC在使用-O2时无论如何都会优化呼叫。

用ceil:

#include <stdio.h>
#include <math.h>

int main()
{
        int m = 3, n = 5, o;

        o = ceil(n / m);
        printf("%d\n", o);
        return 0;
}

#include <stdio.h>
#include <math.h>

int main()
{
        int m = 3, n = 5, o;

        o = n / m;
        printf("%d\n", o);
        return 0;
}

虽然我理解它只有五点,但我仍然想明白为什么我完全错了。

2 个答案:

答案 0 :(得分:4)

评分者可能意味着您需要使用分数n/d的天花板,这是完全正确的:这样会有足够的块来覆盖n,最后一个块可能不完整

这并不意味着适当的实现是使用C表达式ceil(n/d)。实际上,C /是一个整数除法,将丢弃小数部分,实际上取得了分数的下限。

您可以改为使用ceil((double)n/(double)d)

但我最喜欢的方式是不转换为双打:(n+d-1)/d

答案 1 :(得分:-1)

这里,m = 3,n = 5 所以,n / m = 1.67(约); 因为你要分配它是int类型,它会截断它。即,只存储整数部分而不是小数部分,所以我们有o = 1。如果你将使用ceil(n / m),输出将是2,然后将其分配给o。即,o = 2。