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)
尽管我仅了解五点,但我仍然想了解为什么我完全错了。
分级机可能意味着您需要使用分数的上限n/d,这是完全正确的:这样,将有足够的块来覆盖n,最后一块可能不完整。
这并不意味着适当的实现是使用C表达式ceil(n/d)。实际上,C /是整数除法,将舍弃小数部分,实际上占了小数的底数。
您可以ceil((double)n/(double)d)改用。
但我最喜欢的方式是不转换为double :(n+d-1)/d。