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

14

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

也许只是我的问题,但我无法构建“hello world OCL”部分中提到的代码。

我启动了Xcode并创建了一个空项目。创建了一个main.c和一个.cl内核文件,并复制了苹果开发者网站上的内容,但我无法构建任何东西,即使添加了目标也不行。

AD网站没有可下载的项目,因此我不知道失败的原因(可能是我自己的问题,或者该网站假设步骤而未加以说明)。

我还尝试了macresearch.org的示例项目,但它们相当古老,第三课中的测试项目根本无法运行。

现在,我非常确定其他人正在使用Xcode来运行OCL代码,但我找不到任何单个页面(除了上述的macresearch.org),可以清晰地介绍如何在Xcode中运行OCL项目。是否有人知道有关如何使用OCL和Xcode工作的教程?

我已经购买了3本关于OCL的书籍(Gaster的异构计算与OpenCL,Scarpino的实战OpenCL和Munshi的OpenCL编程指南),都没有说明如何设置Xcode,虽然它们详细介绍了Visual Studio和Eclipse的设置。

另外,是否有任何应用程序能够在运行OCL应用程序之前验证内核代码?

非常感谢您提供的任何建议。

3个回答

13

简短回答: https://developer.apple.com/library/mac/#documentation/Performance/Conceptual/OpenCL_MacProgGuide/XCodeHelloWorld/XCodeHelloWorld.html

对于命令行用户的长期回答:

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

这里我采用了苹果公司的OpenCL Hello World示例,并使用默认编译器标志(请参见https://developer.apple.com/library/mac/#documentation/Performance/Conceptual/OpenCL_MacProgGuide/ExampleHelloWorld/Example_HelloWorld.html),并展示了Xcode在后台执行的步骤。

为了帮助您入门,请输入:

/System/Library/Frameworks/OpenCL.framework/Libraries/openclc -x cl -cl-std=CL1.1 -cl-auto-vectorize-enable -emit-gcl mykernel.cl

这将创建2个文件,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

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


谢谢你的回答。你能告诉我使用gcc/llvm编译opencl代码并使用其opencl库与你所描述的方法有什么不同吗? - Amir

6
所以,看起来我能够通过以下方式部分解决这个问题:
  • 创建一个空项目,创建一个main.c文件和一个kernel文件
  • 创建一个控制台应用程序作为目标
  • 在构建设置中,添加OpenCL框架(如果正确添加,您将在左侧面板的文件浏览器中看到它出现)。
  • 指定内核文件所在的位置,硬编码路径(仅说“我的kernel.cl”是不够的,由于某些原因,Xcode无法获取cl文件与主文件在同一目录中的信息,因此在加载内核文件时必须指定路径)

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

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


1
回答你问题的第二部分,关于Mountain Lion,你可以这样运行OpenCL编译器来编译foo.cl
/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_64 gpu_32


非常感谢Eric!这将会很有用! - user393267

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接