2014-11-21 299 views
3

在CUDA C,为什么下面的代码错误:表达式必须具有整数或枚举类型

findMinMax<<sizeof(lum)/1024,1024>>(lum,&min_logLum,&max_logLum); 

给这个错误?

error: expression must have integral or enum type 
+0

您的代码可能在更多级别上出错。解决这个问题后,很可能会遇到运行时错误和崩溃。您可能想要参考SDK附带的CUDA示例以及本示例,了解内核启动的典型范例:http://docs.nvidia.com/cuda/cuda-c-programming-guide/ index.html#device-memory – 2014-11-21 04:08:48

回答

5

您需要使用三重尖括号作为内核启动语法的一部分:

findMinMax<<<sizeof(lum)/1024,1024>>>(lum,&min_logLum,&max_logLum); 

应该可以解决编译错误,只要剩下的就是正确的(例如,集合的参数匹配的内核原型)。

注意一些其他的东西都在可疑你进入内核:

  • 您轮每格,而不是向下向上的块数。例如,如果sizeof(lum)的计算结果为1500,则仍然只启动1个1024线程的数据块。这可能不是你打算做的。

  • 您通过主机指针&min_logLum&max_logLum内核,这又可能是你不打算在这里做什么,但它是很难说没有看到你的代码的其余部分。

+0

OMG OOPS !!!虽然这是一个误导性的错误信息。为什么编译器不能告诉我这些V形图是混乱的?尽管感谢您的帮助! – 2014-11-21 04:09:20

+1

@RenéG,因为编译器在遇到<< and >>时会看到有效的语法。由于缺少斜角括号,您的启动配置将成为一系列操作员呼叫(<<, >>,“,”)。编译器对表达式的操作数进行语义检查,然后识别提供的错误。编译器可能会给你一个提示,你可能从错误的上下文中得到了什么(例如,clang就是这样做的)。 – 2014-11-21 10:34:12

+0

@Michael_Haidl哦,好吧,这是有道理的 – 2014-11-21 21:15:14

相关问题