所以我刚从一个成绩很好的学校项目中得到了成绩,但是成绩下降了5分,因为我没有打电话给赛尔(.)。这是一个使用CUDA的并行计算课程,但这个问题与任何CUDA功能没有直接关系。
以下是“冒犯”的字句:
dim3 dimGrid(n / dimBlock.x, n / dimBlock.y);他说我应该这样做:
dim3 dimGrid(ceil(n / dimBlock.x), ceil(n / dimBlock.y));所以我的问题是,如果n和is块是整数,为什么要标记它呢?它们的结果将在ceil被调用和截断之前进行计算。因此,为此划上记号似乎是愚蠢的。
下面的例子似乎表明GCC在使用-O2时仍然优化了调用。
与赛尔:
#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;
}虽然我只明白其中的5点,但如果我完全错了,我仍然想知道为什么。
发布于 2014-09-30 13:53:30
分级可能意味着您需要使用分数n/d的上限,这是完全正确的:这样就有足够的块覆盖n,最后一个块可能是不完整的。
这并不意味着适当的实现是使用C表达式ceil(n/d)。实际上,C /是一个整数除法,它将丢弃小数部分,实际上是小数的一部分。
您可以使用ceil((double)n/(double)d)代替。
但我最喜欢的方式是不用转换成双打:(n+d-1)/d。
发布于 2014-09-29 18:01:59
这里,m= 3,n=5 so,n/m=1.67(大约);由于您将它赋值o为int类型,它将截断它。也就是说,只存储整数部分而不是十进制部分,因此我们有o=1。如果要使用ceil(n/m),输出将为2,然后将输出分配给o,即o=2。
https://stackoverflow.com/questions/26105925
复制相似问题