所以我刚从学校项目中得到了我的成绩,但我的成绩很好,但是平分师因为我没有打电话给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;
}
虽然我理解它只有五点,但我仍然想明白为什么我完全错了。
答案 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。