所以我剛剛從一所學校項目中取得了成績,而且我的表現很好,但是由於我沒有打電話給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