iOS 5 开始支持 OpenCL 了吗?

2012-07-31 23:41:44 +08:00
 linusyang
意外发现 iOS 5.1.1 的私有框架 (Private Frameworks) 里竟然有 OpenCL,于是就是试着把以前课上要求写的两个简单的 OpenCL 测试小程序移植到 iOS 上去。

一个是在内存和显存中传输数据,并测出内存到内存、内存到显存、显存到显存和显存到内存传输消耗时间;另一个是转换 64 位无符号整数大端小端法表示。程序是 C 语言写的,源代码和 iOS 上的二进制可以在这里找: https://github.com/linusyang/opencl-test-ios 。写得比较锉,测试的误差也可能比较大,见笑了。:)

程序可以跨平台,以前在 OS X 和 Windows 上跑过。现在我用 iOS 5.1 SDK 提供的 Clang 编译,分别在 iPhone 4 和 iPad 2 上跑了一下,截图如下:
iPhone 4: https://github.com/downloads/linusyang/opencl-test-ios/Test-iPhone4.png
iPad 2: https://github.com/downloads/linusyang/opencl-test-ios/Test-iPad2.png
(可以看出,第二个测试用 CPU 跑反而快一点,因为 CPU 用的是 __builtin_bswap64,调用内置的指令集做运算,性能不是很好的 GPU 比不过 CPU 的。)

结果发现 iOS 上用 OpenCL 做并行计算还是很有潜力的,速度不赖。iPhone 4 的显卡比较老了体现不出来,iPad 2 的明显好很多,估计用 iPad 3 测就更厉害了。现在 OpenCL 还处于不公开状态,App Store 里自然不会有程序去用,不知道 Cydia 里有没有程序已经用上了 OpenCL。现在 ARM 平台的显卡还比较鸡肋,以后有了更好的设备,移动并行计算或许能流行起来也说不定啊。
8093 次点击
所在节点    iDev
11 条回复
yezi47
2013-08-06 20:46:55 +08:00
你好,我是新手,我想问下你是用什么软件编写的代码 ,和如何移植到ios上的?用的什么工具?
linusyang
2013-08-09 22:10:00 +08:00
@yezi47 其实就是很简单的 C 语言程序,当时是用 Xcode 写的,移植的话用 iOS SDK 的工具链,交叉编译一下就可以跑了。OpenCL 目前还是私有库,因为存在 JIT、动态代码的问题,是 Apple 的禁区,目前开放的可能性不大,只是给 Apple 自家的系统程序加速。
CocoaBob
2013-09-25 18:43:31 +08:00
搜索iOS上OpenCL信息的时候找到这篇文章,针对Xcode 5做了一些修改,最终在iPhone上跑起来了~但有报错,不得不留言麻烦linusyang兄看看~
makefile里的一些配置,在Xcode 5里有所改变,主要是安装Command Line Tools之后,路径变了,现在的配置是:
CC = /usr/bin/clang
LD = /usr/bin/ld
LDID = /usr/local/bin/ldid
CFLAGS = -arch armv7 -Os -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/ -I./include -framework OpenCL -miphoneos-version-min=3.0 -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/lib/ -F/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/System/Library/PrivateFrameworks -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk
其中ldid需要自己在网上找一下。

但我不知道怎么用make之后的binary……最终还是用Xcode 5来测试~
具体操作是:
1,新建一个项目。
2,删掉AppDelegate等ObjC的文件,删掉main.m,删掉UnitTest相关文件。
3,将include文件夹、endianness.c和transmission.c添加到项目
4,在项目Target设置的Header Search Paths里面,添加include目录所在路径
5,endianness.c、transmission.c这两个文件,只要有一个勾上Target Membership即可。
6,然后真机运行测试。

我遇到的报错分别是:
[OpenCL Endianness Demo - Linus Yang]
[Device: ARM CPU Compute Device]
Error: Failed to build program executable!
<program source>:9:9: warning: comparison of integers of different signs: 'int' and 'const unsigned int'
if(i < count)
~ ^ ~~~~~

[OpenCL Transmission Demo - Linus Yang]
[Device: ARM CPU Compute Device]
Step 1: 15.063000 ms, 531.102702 MB/s
Error: Failed to build program executable!
<program source>:8:9: warning: comparison of integers of different signs: 'int' and 'const unsigned int'
if(i < count)
~ ^ ~~~~~

我对OpenCL完全陌生,不知道该怎么处理这些错误。如果linusyang兄有时间的话,请指点一二~
CocoaBob
2013-09-25 19:09:55 +08:00
@CocoaBob 对了,试过加上或去掉unsigned,只是少了最后的warning,Error依然存在。
稍微看了一下文档,clBuildProgram返回值是-11,即CL_BUILD_PROGRAM_FAILURE。而clGetProgramBuildInfo没有返回任何细节……
linusyang
2013-09-26 00:22:50 +08:00
@CocoaBob 不好意思刚看到。是我的问题,之前写得 Makefile 太老了,刚才抽空更新了一下,应该可以适配 Xcode 5.0 了,试试看?
CocoaBob
2013-09-26 06:10:00 +08:00
@linusyang 非常感谢,我这还没到第二天呢,答复非常及时~目前手头iPhone、iPad都升级到了iOS 7,未越狱状态下应该无法ssh了对吧?不知道有没有其他方法来测试这两个程序?目前我的解决方法是在Xcode里新建个项目,用付费的开发者账户code sign后再真机调试……不过遇到了上面所述的error,也许是项目设置问题。先去休息了,明天再研究研究~
linusyang
2013-09-26 11:56:31 +08:00
@CocoaBob 我这边电脑和手机上测试貌似都没问题,待会我整个可以真机调试的工程再测一下,再写个简单的界面吧。
chen2308
2013-09-26 16:08:29 +08:00
Hi,我发现你文中有个小错误:
“(可以看出,第二个测试用 CPU 跑反而快一点,因为 CPU 用的是 __builtin_bswap64,调用内置的指令集做运算,性能不是很好的 GPU 比不过 CPU 的。)”
在iphone 5s之前的sgx gpu根本不支持OpenCL,你这边得到的时间其实都是CPU时间。
另外,我发现在5S上也不支持GPU,估计是驱动还没有准备好。
linusyang
2013-09-26 18:08:58 +08:00
@chen2308 那就怪了,难道是 iOS 的 OpenCL 库直接调用 CPU 运算的么?我也不是很清楚啊。貌似程序编译以后可以正常执行 OpenCL 库的那些函数: https://github.com/downloads/linusyang/opencl-test-ios/Test-iPad2.png
chen2308
2013-09-29 17:13:43 +08:00
@linusyang 是的,他们用的都市CPU运算,你的结果里device都是ARM CPU, 如果出现GPU的话才是用GPU进行运算。
linusyang
2013-09-30 00:55:35 +08:00
@chen2308 可能吧,不过其实若是 SOC 都会显示为 CPU 型号的,例如在 GPU 为 HD 4000 的机器上跑这个测试程序显示的结果是这样的:[Device: Intel(R) Core(TM) i5-3317U CPU @ 1.70GHz]

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/43989

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX