Luk*_*asz 11 performance shader ios metal
我做了一个简单的实验,通过实现naive char搜索算法,在CPU和GPU上使用iOS8 Metal计算管道搜索每行50个字符(50 mil字符映射)的1.000.000行.
CPU实现使用简单的循环,Metal实现给每个内核1行进行处理(下面的源代码).
令我惊讶的是,Metal实现平均比简单的线性CPU(如果我使用1个核心)慢2-3倍,如果我使用2个核心(每个都搜索一半数据库),则慢3-4倍!我尝试了每组不同的线程(16,32,64,128,512)但仍然得到非常相似的结果.
iPhone 6:
CPU 1 core: approx 0.12 sec
CPU 2 cores: approx 0.075 sec
GPU: approx 0.35 sec (relEase mode, validation disabled)
Run Code Online (Sandbox Code Playgroud)
我可以看到Metal shader花费超过90%的访问内存(见下文).
可以做些什么来优化它?
任何见解都将受到赞赏,因为互联网上没有太多来源(除了标准的Apple编程指南),提供有关内存访问内部的详细信息以及特定于Metal框架的权衡.
金属实施细节:
主机代码要点:https: //gist.github.com/lukaszmargielewski/0a3b16d4661dd7d7e00d
内核(着色器)代码:https: //gist.github.com/lukaszmargielewski/6b64d06d2d106d110126
GPU帧捕获分析结果:
