2017-02-26 40 views
0

「無符號整數與零的比較毫無意義」關於做好警告:CUDA

if(blockIdx.y-threadIdx.y >=0){ 
//some operation } 

我得到了上述警告。誰能告訴我爲什麼CUDA編譯器會將此作爲警告提示。我只是試圖只允許符合上述條件的線程進入if語句。 如果我忽略它,會有什麼後果嗎? 請注意,我推出多個塊爲:

dim3 nblocks (7,7) 
dim3 nthreadsperblock (256,256) 
kernel<<<nblocks,nthreadsperblock>>>(...) 
+4

警告告訴你一切。您可以減去兩個**無符號**值,因此結果總是至少爲0 – mpiatek

+0

@mpiatek for blockidx.y = 1,threadix.y> 1的線程會導致負值?我試圖過濾掉 – darkfall94

+2

@ darkfall94:沒有。無符號表達式的結果是無符號類型,因此必然是非負的。無符號類型在整型mod TYPE_MAX + 1上表現爲模運算。 –

回答

1

你應該投的變量signed int S或改變表達if(blockIdx.y>=threadIdx.y){這是數學等同於if(blockIdx.y-threadIdx.y >=0){

不久,您可以將所有(a - b *op* 0)替換爲(a *op* b),其中*op*是比較運算符之一。

+3

在沒有對可能值範圍進行進一步假設的情況下,鑄造不是等同的並且不安全。您必須像在第二個解決方案中一樣重寫表達式。 –

+0

@R ..謝謝,它的工作。 – darkfall94