使用Ceil和Integer

csn*_*ate 3 c optimization ceil

因此,我只是从我做得很好的学校项目中获得了成绩,但由于我没有打电话给ceil(...),因此该年级学生获得了5分的折扣。它是使用CUDA的并行计算过程,但问题与CUDA的任何功能都没有直接关系。

这是“违规”行:

dim3 dimGrid(n / dimBlock.x, n / dimBlock.y);
Run Code Online (Sandbox Code Playgroud)

他的主张是我应该这样做:

dim3 dimGrid(ceil(n / dimBlock.x), ceil(n / dimBlock.y));
Run Code Online (Sandbox Code Playgroud)

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

下面的示例似乎表明,使用-O2时,无论如何GCC都会优化标注。

使用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;
}
Run Code Online (Sandbox Code Playgroud)

没有:

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

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

        o = n / m;
        printf("%d\n", o);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

尽管我仅了解五点,但我仍然想了解为什么我完全错了。

Yve*_*ust 5

分级机可能意味着您需要使用分数的上限n/d,这是完全正确的:这样,将有足够的块来覆盖n,最后一块可能不完整。

这并不意味着适当的实现是使用C表达式ceil(n/d)。实际上,C /是整数除法,将舍弃小数部分,实际上占了小数的底数。

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

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