V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
linusyang
V2EX  ›  iDev

iOS 5 开始支持 OpenCL 了吗?

  •  
  •   linusyang · 2012-07-31 23:41:44 +08:00 · 8218 次点击
    这是一个创建于 4527 天前的主题,其中的信息可能已经有所发展或是发生改变。
    意外发现 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 平台的显卡还比较鸡肋,以后有了更好的设备,移动并行计算或许能流行起来也说不定啊。
    11 条回复    1970-01-01 08:00:00 +08:00
    yezi47
        1
    yezi47  
       2013-08-06 20:46:55 +08:00
    你好,我是新手,我想问下你是用什么软件编写的代码 ,和如何移植到ios上的?用的什么工具?
    linusyang
        2
    linusyang  
    OP
       2013-08-09 22:10:00 +08:00
    @yezi47 其实就是很简单的 C 语言程序,当时是用 Xcode 写的,移植的话用 iOS SDK 的工具链,交叉编译一下就可以跑了。OpenCL 目前还是私有库,因为存在 JIT、动态代码的问题,是 Apple 的禁区,目前开放的可能性不大,只是给 Apple 自家的系统程序加速。
    CocoaBob
        3
    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
        4
    CocoaBob  
       2013-09-25 19:09:55 +08:00
    @CocoaBob 对了,试过加上或去掉unsigned,只是少了最后的warning,Error依然存在。
    稍微看了一下文档,clBuildProgram返回值是-11,即CL_BUILD_PROGRAM_FAILURE。而clGetProgramBuildInfo没有返回任何细节……
    linusyang
        5
    linusyang  
    OP
       2013-09-26 00:22:50 +08:00
    @CocoaBob 不好意思刚看到。是我的问题,之前写得 Makefile 太老了,刚才抽空更新了一下,应该可以适配 Xcode 5.0 了,试试看?
    CocoaBob
        6
    CocoaBob  
       2013-09-26 06:10:00 +08:00
    @linusyang 非常感谢,我这还没到第二天呢,答复非常及时~目前手头iPhone、iPad都升级到了iOS 7,未越狱状态下应该无法ssh了对吧?不知道有没有其他方法来测试这两个程序?目前我的解决方法是在Xcode里新建个项目,用付费的开发者账户code sign后再真机调试……不过遇到了上面所述的error,也许是项目设置问题。先去休息了,明天再研究研究~
    linusyang
        7
    linusyang  
    OP
       2013-09-26 11:56:31 +08:00
    @CocoaBob 我这边电脑和手机上测试貌似都没问题,待会我整个可以真机调试的工程再测一下,再写个简单的界面吧。
    chen2308
        8
    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
        9
    linusyang  
    OP
       2013-09-26 18:08:58 +08:00   ❤️ 1
    @chen2308 那就怪了,难道是 iOS 的 OpenCL 库直接调用 CPU 运算的么?我也不是很清楚啊。貌似程序编译以后可以正常执行 OpenCL 库的那些函数: https://github.com/downloads/linusyang/opencl-test-ios/Test-iPad2.png
    chen2308
        10
    chen2308  
       2013-09-29 17:13:43 +08:00   ❤️ 1
    @linusyang 是的,他们用的都市CPU运算,你的结果里device都是ARM CPU, 如果出现GPU的话才是用GPU进行运算。
    linusyang
        11
    linusyang  
    OP
       2013-09-30 00:55:35 +08:00
    @chen2308 可能吧,不过其实若是 SOC 都会显示为 CPU 型号的,例如在 GPU 为 HD 4000 的机器上跑这个测试程序显示的结果是这样的:[Device: Intel(R) Core(TM) i5-3317U CPU @ 1.70GHz]
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5162 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 09:38 · PVG 17:38 · LAX 01:38 · JFK 04:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.