【发布时间】:2015-06-09 19:01:38
【问题描述】:
我正在尝试编译此处找到的代码:http://developer.amd.com/tools-and-sdks/opencl-zone/opencl-resources/introductory-tutorial-to-opencl/
我正在用命令编译它:
g++ -Wall -O2 -lm -lOpenCL -g -Wno-unknown-pragmas foo.cpp -o foo
导致问题的代码部分是这样的:
#pragma OPENCL EXTENSION cl_khr_byte_addressable_store : enable
__constant char hw[] = "Hello World\n";
__kernel void hello(__global char * out) {
size_t tid = get_global_id(0);
out[tid] = hw[tid];
}
我收到以下错误:
foo.cpp:105:2: error: ‘__constant’ does not name a type
__constant char hw[] = "Hello World\n";
foo.cpp:107:2: error: ‘__kernel’ does not name a type
__kernel void hello(__global char * out) {
有人可以解释为什么会这样吗?标题与链接上的完全相同。
谢谢
【问题讨论】:
-
看起来您正在尝试将 OpenCL 代码编译为本机代码(以在您的 CPU 上运行)。据我所知,gcc 不承认 opencl 是一种语言。您需要一个 opencl 编译器来编译代码。 Clang 确实理解 opencl,但如果没有运行时库形式的进一步支持,您仍然无法将其编译为本机应用程序。使用 OpenCL 的正常方法是使用 clCreateProgramFromSource()、clBuildProgram()、clCreateKernel() 和 clEnqueueNDRange() [之前/之后有一些样板]
-
@MatsPetersson 是正确的(应该将其作为答案提交)
-
我没有按照链接的建议尝试使用 GCC 进行编译。我正在使用带有 -lOpenCl 的 g++,他应该工作这就是为什么我很困惑......其他 opencl 函数调用都发现它只是内核方法的声明是一个问题
-
g++ 是 gcc C++ 变体。正如我在下面的回答中所描述的,内核是使用 clCreateProgramWithSource 或类似的东西从您的 OpenCL 主机代码编译而来的。 AMD 工具很可能还有一个离线编译器,您可以使用它来创建二进制文件,然后可以使用 clCreateProgramWithBinary 加载该文件,但我很确定这对您没有多大帮助。我在 ARM 使用 OpenCL,所以不知道 AMD 解决方案的细节,但我希望它与 ARM 产品有很多相似之处。
标签: c++ parallel-processing kernel opencl