iOS Metal计算管道比搜索任务的CPU实现慢

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帧捕获分析结果:

在此输入图像描述

小智 0

我也会猜测,GPU没有针对if/else进行优化,它不会预测分支(它可能执行两者),尝试以更线性的方式重写算法,而不需要任何条件或将它们减少到最低限度。