所以我刚刚从一所学校项目中取得了成绩,而且我的表现很好,但是由于我没有打电话给ceil(...),因此分级考试得了5分。它是一个使用CUDA的并行计算课程,但问题与任何CUDA功能都没有直接关系。Ceil和Integers的使用
这里是“有问题的”路线:
dim3 dimGrid(n/dimBlock.x, n/dimBlock.y);
他的要求是我应该做的:
dim3 dimGrid(ceil(n/dimBlock.x), ceil(n/dimBlock.y));
所以我的问题是,为什么我会被标记过如果n此和dimBlock。*是整数?他们的结果将在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;
}
虽然我知道它只有五点,我还是想知道为什么,如果我是完全错误的。
也许他们不应该是整数? – Boann 2014-09-29 17:57:38
如果你打算四舍五入,那么你需要投到一个浮动,以避免整数除法或做一些像'(n + dimBlock.x - 1)/ dimBlock.x' – Mysticial 2014-09-29 17:58:01
这就是事情,你不会打算整理,也不会期望是浮动的。 dimBlock *根据定义,在CUDA中总是一个整数值,'n'是矩阵每个维度的大小。有问题的特定代码涉及索引处理,因此实际上可能会导致分段错误 – csnate 2014-09-29 17:59:16