如何设置Xcode来运行OpenCL代码,以及如何在构建之前验证内核

如何设置Xcode来运行OpenCL代码,以及如何在构建之前验证内核,xcode,opencl,Xcode,Opencl,我正在查看苹果网站上的官方文档,我发现有一个关于如何在Xcode上使用OpenCL的快速入门 也许只有我一个人,但我没有运气构建“hello world OCL”部分提到的代码 我启动了Xcode并创建了一个空项目;创建了一个main.c和一个.cl内核文件,粘贴了Apple开发者网站上的内容,我无法获得任何要构建的内容,即使在添加了一个目标之后 该广告网站没有可下载的项目,因此我对失败的原因一无所知(很可能是我,或者该网站假设了一些步骤,但没有提及这些步骤) 我还尝试了macresearch.

我正在查看苹果网站上的官方文档,我发现有一个关于如何在Xcode上使用OpenCL的快速入门

也许只有我一个人,但我没有运气构建“hello world OCL”部分提到的代码

我启动了Xcode并创建了一个空项目;创建了一个main.c和一个.cl内核文件,粘贴了Apple开发者网站上的内容,我无法获得任何要构建的内容,即使在添加了一个目标之后

该广告网站没有可下载的项目,因此我对失败的原因一无所知(很可能是我,或者该网站假设了一些步骤,但没有提及这些步骤)

我还尝试了macresearch.org的示例项目,但是它们非常古老,第三课中的测试项目根本没有运行

现在,我很确定其他人正在使用Xcode运行OCL代码,但是我找不到任何一个页面(除了前面提到的macresearch.org)可以清楚地说明如何使用OCL运行Xcode项目。有没有人知道如何使用OCL和Xcode的教程

我已经购买了3本关于OCL的书(Gaster的异构计算与OpenCL、Scarpino的OpenCL和Munshi的OpenCL编程指南),都没有提到如何设置Xcode,但它们详细介绍了visual studio设置,甚至eclipse设置

在侧面;是否有任何应用程序能够在OCL应用程序中运行内核代码之前对其进行验证


提前感谢您提供的任何建议。

要回答问题的第二部分,在Mountain Lion上,您可以在
foo.cl
上运行OpenCL编译器,如下所示:

/System/Library/Frameworks/OpenCL.framework/Libraries/openclc \
    -c -Wall -emit-llvm -arch gpu_32 -o foo.bc foo.cl

它将编译
foo.cl
为LLVM位代码
foo.bc
。此二进制文件可与
clCreateProgramWithBinary
一起使用,其速度比
clCreateProgramWithSource
快。
-arch
的有效值是
i386 x86\u 64 gpu\u 32

因此,我似乎能够通过以下方式部分解决此问题:

  • 创建一个空项目,创建一个main.c文件和一个内核文件

  • 将目标创建为控制台应用程序

  • 在构建设置中,添加OpenCL框架(如果添加正确,您将看到它出现在左窗格的文件浏览器中)

  • 指定内核文件所在的位置,对路径进行硬编码(仅仅说“my kernel.cl”是不够的;Xcode由于某些原因无法得到cl文件与主文件位于同一目录中,因此在加载内核文件时必须指定路径)

我成功地使用了这些步骤,同时在Apple开发者网站上使用了示例代码

我确信还有其他方法可以做到这一点,但至少这可以帮助像我这样不知道如何开始的人。

简短回答:

命令行程序的详细答案:

使用最新的Xcode(和Lion或更高版本),您甚至不需要调用
clCreateProgramWithSource
,只需编写内核并从应用程序调用它,不过还需要一些额外的编译步骤

我在这里使用苹果的OpenCL Hello World示例,使用默认编译器标志(请参阅),并在后台显示Xcode将执行的步骤

要开始,请执行以下操作:

/System/Library/Frameworks/OpenCL.framework/Libraries/openclc -x cl -cl-std=CL1.1 -cl-auto-vectorize-enable -emit-gcl mykernel.cl
这将创建两个文件,mykernel.cl.h和mykernel.cl.c(mykernel.cl.c完成了将内核加载到应用程序中的所有功能)。接下来,您需要编译内核:

/System/Library/Frameworks/OpenCL.framework/Libraries/openclc -x cl -cl-std=CL1.1 -Os -triple i386-applecl-darwin -emit-llvm-bc -o mykernel.cl.i386.bc mykernel.cl
/System/Library/Frameworks/OpenCL.framework/Libraries/openclc -x cl -cl-std=CL1.1 -Os -triple x86_64-applecl-darwin -emit-llvm-bc -o mykernel.cl.x86_64.bc mykernel.cl
/System/Library/Frameworks/OpenCL.framework/Libraries/openclc -x cl -cl-std=CL1.1 -Os -triple gpu_32-applecl-darwin -emit-llvm-bc -o mykernel.cl.gpu_32.bc mykernel.cl
最后但并非最不重要的是,构建应用程序本身:

clang -c -Os -Wall -arch x86_64 -o mykernel.cl.o mykernel.cl.c
clang -c -Os -Wall -arch x86_64 -o square.o square.c
clang -framework OpenCL -o square mykernel.cl.o square.o

就这样。在Apple的示例代码中,您不会看到任何
clCreateProgramWithBinary
clCreateProgramWithSource
。一切都是通过mykernel.cl.c完成的,由
openclc

生成,非常感谢Eric!这将是有用的!谢谢你的回答。您能告诉我让gcc/llvm使用opencl库编译opencl代码与您描述的方法有什么不同吗?