2017-02-26 44 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